"""
Journal Entry Validator
=======================
Reads a CSV of journal entries, validates that each transaction
balances (debits = credits), and produces account-level summaries.

Usage: python validate_journal_entries.py <filename>
"""
import pandas as pd
import sys


def load_entries(filename):
    """Load journal entries from a CSV file."""
    df = pd.read_csv(filename)
    return df


def validate_transactions(df):
    """Check that debits equal credits for each transaction."""
    results = []
    grouped = df.groupby("TransactionID")

    for txn_id, group in grouped:
        total_debits = group["Debit"].sum()
        total_credits = group["Credit"].sum()
        balanced = abs(total_debits - total_credits) < 0.01
        results.append({
            "TransactionID": txn_id,
            "Debits": total_debits,
            "Credits": total_credits,
            "Balanced": balanced
        })

    return pd.DataFrame(results)


def summarize_accounts(df):
    """Calculate net balance for each account."""
    summary = df.groupby("Account").agg(
        TotalDebits=("Debit", "sum"),
        TotalCredits=("Credit", "sum")
    ).reset_index()
        summary["NetBalance"] = summary["TotalDebits"] - summary["TotalCredits"]
    return summary


def print_report(validation, summary):
    """Print the full validation report."""
    unbalanced = validation[validation["Balanced"] == False]

    if len(unbalanced) == 0:
        print("\nAll transactions balanced!")
    else:
        print(f"\nWARNING: {len(unbalanced)} unbalanced transaction(s):")
        print(unbalanced.to_string(index=False))

    print("\n" + "=" * 50)
    print("Account Summary")
    print("=" * 50)
    print(summary.to_string(index=False))

    total_dr = summary["TotalDebits"].sum()
    total_cr = summary["TotalCredits"].sum()
    print(f"\nTotal Debits:  ${total_dr:,.2f}")
    print(f"Total Credits: ${total_cr:,.2f}")

    if abs(total_dr - total_cr) < 0.01:
        print("Trial balance VERIFIED")
    else:
        print(f"DISCREPANCY: ${abs(total_dr - total_cr):,.2f}")


def main():
    if len(sys.argv) != 2:
        print("Usage: python validate_journal_entries.py <filename>")
        sys.exit(1)

    filename = sys.argv[1]
    print(f"Loading entries from {filename}...")

    df = load_entries(filename)
    print(f"Loaded {len(df)} journal entries")

    validation = validate_transactions(df)
    summary = summarize_accounts(df)
    print_report(validation, summary)


if __name__ == "__main__":
    main()
