from django.contrib.auth import get_user_model
from django.test import TestCase
from django.utils import timezone

from shop_management.models.data.purchase import Purchase
from shop_management.models.data.sale import Sale
from shop_management.models.data.shop import Shop
from shop_management.services.purchases import _purchase_number
from shop_management.services.sales import _sale_number


class BranchInvoiceNumberTests(TestCase):
    def setUp(self):
        self.user = get_user_model().objects.create_user(username="invoice-sequences")
        # Deliberately use the same first three letters to prove that the
        # sequence is scoped by branch rather than by the display prefix.
        self.first = Shop.objects.create(owner=self.user, name="Agriculture North")
        self.second = Shop.objects.create(owner=self.user, name="Agriculture South")

    def test_sales_start_at_one_independently_in_each_branch(self):
        first = Sale(shop=self.first, invoice_date=timezone.localdate())
        second = Sale(shop=self.second, invoice_date=timezone.localdate())
        self.assertEqual(_sale_number(first), f"AGR-SAL-{timezone.localdate().year}-000001")
        Sale.objects.create(
            shop=self.first, invoice_date=timezone.localdate(),
            sale_number=_sale_number(first),
        )
        self.assertEqual(_sale_number(second), f"AGR-SAL-{timezone.localdate().year}-000001")

    def test_purchases_start_at_one_independently_in_each_branch(self):
        first = Purchase(shop=self.first, purchase_date=timezone.localdate())
        second = Purchase(shop=self.second, purchase_date=timezone.localdate())
        self.assertEqual(_purchase_number(first), f"AGR-PUR-{timezone.localdate().year}-000001")
        Purchase.objects.create(
            shop=self.first, purchase_date=timezone.localdate(),
            purchase_number=_purchase_number(first),
        )
        self.assertEqual(_purchase_number(second), f"AGR-PUR-{timezone.localdate().year}-000001")
