"""
Enterprise-grade default Chart of Accounts and posting rule templates.

Operational modules raise business events; the posting engine reads
AccountMapping rows and creates balanced journal lines in AccountHistory.

Bank register accounts (1010 operational) live under Finance → Banking.
GL control accounts here follow standard number ranges (1000–7999).
"""
from __future__ import annotations

# (account_number, account_name, type_key, detail_name)
DEFAULT_CHART_OF_ACCOUNTS = [
    # Assets 1000–1999
    ("1000", "Cash on Hand", "cash_and_cash_equivalents", "Cash on Hand"),
    ("1100", "Accounts Receivable", "accounts_receivable", "Accounts Receivable"),
    ("1200", "Inventory", "current_assets", "Inventory"),
    ("1300", "Prepaid Expenses", "current_assets", "Prepaid Expenses"),
    ("1500", "Fixed Assets", "fixed_assets", "Machinery & Equipment"),
    # Liabilities 2000–2999
    ("2000", "Accounts Payable", "accounts_payable", "Accounts Payable"),
    ("2050", "Goods Received Not Invoiced", "current_liabilities", "Goods Received Not Invoiced"),
    ("2100", "Tax Payable", "current_liabilities", "VAT Payable"),
    ("2200", "Salaries Payable", "current_liabilities", "Wages Payable"),
    ("2300", "Customer Deposits", "current_liabilities", "Customer Deposits"),
    # Equity 3000–3999
    ("3000", "Owner Capital", "owners_equity", "Share Capital"),
    ("3100", "Retained Earnings", "owners_equity", "Retained Earnings"),
    ("3150", "Opening Balance Equity", "owners_equity", "Opening Balance Equity"),
    # Revenue 4000–4999
    ("4000", "Sales Revenue", "income", "Sales Revenue"),
    ("4100", "Service Revenue", "income", "Service Revenue"),
    ("4200", "Discounts Given", "income", "Discounts Given"),
    # Cost of sales 5000–5999
    ("5000", "Cost of Goods Sold", "cost_of_sales", "Cost of Goods Sold"),
    ("5100", "Shipping Costs", "cost_of_sales", "Freight and Delivery"),
    # Expenses 6000–7999
    ("6000", "Salaries Expense", "expenses", "Salaries & Wages"),
    ("6100", "Rent Expense", "expenses", "Rent Expense"),
    ("6200", "Utilities", "expenses", "Utilities"),
    ("6300", "Marketing Expense", "expenses", "Marketing & Advertising"),
]

# Standard ERP posting rules: event → (debit_account_number, credit_account_number, label)
DEFAULT_POSTING_RULES = [
    {
        "mapping_type": "invoice_posting",
        "source_key": "sales_invoice",
        "source_label": "Sales Invoice",
        "description": "DR Accounts Receivable · CR Sales Revenue",
        "debit_number": "1100",
        "credit_number": "4000",
    },
    {
        "mapping_type": "payment_posting_sale",
        "source_key": "customer_payment",
        "source_label": "Customer Payment",
        "description": "DR Cash · CR Accounts Receivable",
        "debit_number": "1000",
        "credit_number": "1100",
    },
    {
        "mapping_type": "delivery_posting",
        "source_key": "goods_delivery",
        "source_label": "Delivery / Goods Issue",
        "description": "DR Cost of Goods Sold · CR Inventory",
        "debit_number": "5000",
        "credit_number": "1200",
    },
    {
        "mapping_type": "purchase_posting",
        "source_key": "goods_receipt",
        "source_label": "Goods Receipt (GRN)",
        "description": "DR Inventory · CR Goods Received Not Invoiced",
        "debit_number": "1200",
        "credit_number": "2050",
    },
    {
        "mapping_type": "purchase_posting",
        "source_key": "vendor_invoice",
        "source_label": "Supplier Invoice",
        "description": "DR GRNI · CR Accounts Payable",
        "debit_number": "2050",
        "credit_number": "2000",
    },
    {
        "mapping_type": "payment_posting_expense",
        "source_key": "supplier_payment",
        "source_label": "Supplier Payment",
        "description": "DR Accounts Payable · CR Cash",
        "debit_number": "2000",
        "credit_number": "1000",
    },
    {
        "mapping_type": "payroll_posting",
        "source_key": "payroll_accrual",
        "source_label": "Payroll Accrual",
        "description": "DR Salaries Expense · CR Salaries Payable",
        "debit_number": "6000",
        "credit_number": "2200",
    },
    {
        "mapping_type": "payroll_posting",
        "source_key": "payroll_payment",
        "source_label": "Payroll Payment",
        "description": "DR Salaries Payable · CR Cash",
        "debit_number": "2200",
        "credit_number": "1000",
    },
]

# Expense category → GL debit account (credit = bank/cash account at payment time)
DEFAULT_EXPENSE_CATEGORY_MAPPINGS = [
    {
        "source_key": "utility_expense",
        "source_label": "Utility Expense",
        "debit_number": "6200",
        "description": "DR Utilities · CR Bank/Cash",
    },
    {
        "source_key": "rent_expense",
        "source_label": "Rent Expense",
        "debit_number": "6100",
        "description": "DR Rent Expense · CR Bank/Cash",
    },
    {
        "source_key": "operations_expense",
        "source_label": "Operations Expense",
        "debit_number": "6300",
        "description": "DR Marketing/Operations · CR Bank/Cash",
    },
    {
        "source_key": "tax_and_license_expense",
        "source_label": "Tax and License Expense",
        "debit_number": "6300",
        "description": "DR Operating Expense · CR Bank/Cash",
    },
    {
        "source_key": "entertainment_and_private_expense",
        "source_label": "Entertainment and Private Expense",
        "debit_number": "6300",
        "description": "DR Operating Expense · CR Bank/Cash",
    },
    {
        "source_key": "other",
        "source_label": "Other Expense",
        "debit_number": "6300",
        "description": "DR Operating Expense · CR Bank/Cash",
    },
    {
        "source_key": "refund_expense",
        "source_label": "Refund Expense",
        "debit_number": "4200",
        "description": "DR Discounts Given · CR Bank/Cash",
    },
    {
        "source_key": "capital_expenditure",
        "source_label": "Capital Expenditure",
        "debit_number": "1500",
        "description": "DR Fixed Assets · CR Bank/Cash",
    },
]

COA_NUMBER_RANGES = [
    ("1000–1999", "Assets", "balance_sheet"),
    ("2000–2999", "Liabilities", "balance_sheet"),
    ("3000–3999", "Equity", "balance_sheet"),
    ("4000–4999", "Revenue", "income_statement"),
    ("5000–5999", "Cost of Sales", "income_statement"),
    ("6000–7999", "Expenses", "income_statement"),
]
