from django.db import transaction

from shop_management.models.data.accounting import LedgerAccount


STANDARD_CHART = (
    ("1000", "Assets", "ASSET", None, False),
    ("1100", "Cash", "ASSET", "1000", True),
    ("1200", "Bank", "ASSET", "1000", True),
    ("1300", "Sarafi", "ASSET", "1000", True),
    ("1400", "Accounts Receivable", "ASSET", "1000", True),
    ("1500", "Inventory", "ASSET", "1000", True),
    ("2000", "Liabilities", "LIABILITY", None, False),
    ("2100", "Accounts Payable", "LIABILITY", "2000", True),
    ("3000", "Equity", "EQUITY", None, False),
    ("3100", "Opening Balance Equity", "EQUITY", "3000", True),
    ("3200", "Retained Earnings", "EQUITY", "3000", True),
    ("4000", "Income", "INCOME", None, False),
    ("4100", "Sales Revenue", "INCOME", "4000", True),
    ("4200", "Other Income", "INCOME", "4000", True),
    ("5000", "Cost of Sales", "EXPENSE", None, False),
    ("5100", "Cost of Goods Sold", "EXPENSE", "5000", True),
    ("6000", "Expenses", "EXPENSE", None, False),
    ("6100", "Salary Expense", "EXPENSE", "6000", True),
    ("6200", "Rent Expense", "EXPENSE", "6000", True),
    ("6300", "Utilities Expense", "EXPENSE", "6000", True),
    ("6400", "Transport Expense", "EXPENSE", "6000", True),
    ("6500", "Transfer Charge Expense", "EXPENSE", "6000", True),
    ("6900", "Other Expense", "EXPENSE", "6000", True),
)


@transaction.atomic
def initialize_standard_chart(shop, *, user):
    by_code = {row.code: row for row in LedgerAccount.objects.filter(shop=shop)}
    created = 0
    for code, name, account_type, parent_code, allow_posting in STANDARD_CHART:
        account, was_created = LedgerAccount.objects.update_or_create(
            shop=shop,
            code=code,
            defaults={
                "name": name,
                "account_type": account_type,
                "parent": by_code.get(parent_code),
                "allow_posting": allow_posting,
                "is_system": True,
                "is_active": True,
                "created_by": user,
            },
        )
        by_code[code] = account
        created += int(was_created)
    return created
