from django.contrib.auth import get_user_model
from django.test import TestCase
from django.utils import timezone
from rest_framework.test import APIClient

from shop_management.models.data.product import Product
from shop_management.models.data.purchase import Purchase, PurchaseItem
from shop_management.models.data.shop import Shop
from shop_management.models.data.supplier import Supplier
from shop_management.models.data.utils import Currency


class SupplierReportDocumentStatusTests(TestCase):
    def setUp(self):
        self.user = get_user_model().objects.create_user(
            username="supplier-report-user",
            password="x",
            is_staff=True,
            allowed_tabs=["reports"],
        )
        self.shop = Shop.objects.create(owner=self.user, name="Kabul")
        self.currency = Currency.objects.create(shop=self.shop, title="USD")
        self.supplier = Supplier.objects.create(shop=self.shop, name="Supplier")
        self.product = Product.objects.create(shop=self.shop, name="Medicine")
        self.client = APIClient()
        self.client.force_authenticate(self.user)

    def create_purchase(self, document_status, quantity):
        purchase = Purchase.objects.create(
            shop=self.shop,
            supplier=self.supplier,
            currency=self.currency,
            purchase_date=timezone.localdate(),
            uses_inventory_engine=True,
            document_status=document_status,
        )
        PurchaseItem.objects.create(
            purchase=purchase,
            product=self.product,
            currency=self.currency,
            quantity=quantity,
            buy_price="10.00",
        )
        return purchase

    def test_report_excludes_draft_and_cancelled_purchase_invoices(self):
        posted = self.create_purchase(Purchase.DocumentStatus.POSTED, 3)
        self.create_purchase(Purchase.DocumentStatus.DRAFT, 100)
        self.create_purchase(Purchase.DocumentStatus.VOID, 100)

        response = self.client.get(
            "/api/shop/supplier-report/",
            {"shop": self.shop.pk, "supplier": self.supplier.pk},
            HTTP_X_SELECTED_SHOP=str(self.shop.pk),
            HTTP_HOST="localhost",
        )

        self.assertEqual(response.status_code, 200, response.data)
        report = response.data["suppliers"][0]
        self.assertEqual(
            [purchase["id"] for purchase in report["purchases"]],
            [posted.pk],
        )
        self.assertEqual(report["summary"]["total_purchases_amount"], 30.0)
        self.assertEqual(report["summary"]["outstanding_amount"], 30.0)
