from django.contrib.auth import get_user_model
from django.test import TestCase

from shop_management.models.data.accounting import LedgerAccount
from shop_management.models.data.shop import Shop
from shop_management.services.chart_of_accounts import initialize_standard_chart


class ChartOfAccountsTests(TestCase):
    def setUp(self):
        self.user = get_user_model().objects.create_user(username="ledger-admin", password="test")
        self.shop = Shop.objects.create(owner=self.user, name="Kabul")

    def test_standard_chart_is_complete_and_idempotent(self):
        self.assertEqual(initialize_standard_chart(self.shop, user=self.user), 23)
        self.assertEqual(LedgerAccount.objects.filter(shop=self.shop).count(), 23)
        self.assertEqual(initialize_standard_chart(self.shop, user=self.user), 0)
        self.assertEqual(LedgerAccount.objects.filter(shop=self.shop).count(), 23)

    def test_standard_hierarchy_and_posting_flags(self):
        initialize_standard_chart(self.shop, user=self.user)
        assets = LedgerAccount.objects.get(shop=self.shop, code="1000")
        cash = LedgerAccount.objects.get(shop=self.shop, code="1100")
        cogs = LedgerAccount.objects.get(shop=self.shop, code="5100")
        self.assertIsNone(assets.parent)
        self.assertFalse(assets.allow_posting)
        self.assertEqual(cash.parent, assets)
        self.assertTrue(cash.allow_posting)
        self.assertEqual(cogs.account_type, LedgerAccount.AccountType.EXPENSE)
