from datetime import timedelta
from decimal import Decimal

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.inventory import InventoryBatch, StockBalance, StockMovement
from shop_management.models.data.organization import Warehouse
from shop_management.models.data.product import Product
from shop_management.models.data.shop import Shop
from shop_management.models.data.utils import Currency


class InventoryReportTests(TestCase):
    def setUp(self):
        self.user = get_user_model().objects.create_user(username="inventory-report", is_staff=True)
        self.user.allowed_tabs = ["reports"]; self.user.save(update_fields=["allowed_tabs"])
        self.shop = Shop.objects.create(owner=self.user, name="Kabul")
        self.warehouse = Warehouse.objects.create(shop=self.shop, code="MAIN", name="Main")
        self.currency = Currency.objects.create(shop=self.shop, title="AFN")
        self.product = Product.objects.create(shop=self.shop, name="Vaccine", minimum_stock_level=10)
        self.batch = InventoryBatch.objects.create(product=self.product, batch_number="B-1", expiry_date=timezone.localdate() + timedelta(days=10))
        StockBalance.objects.create(warehouse=self.warehouse, product=self.product, batch=self.batch, quantity=5, average_cost=100, cost_currency=self.currency)
        StockMovement.objects.create(warehouse=self.warehouse, product=self.product, batch=self.batch, movement_type="OPENING", quantity_in=5, unit_cost=100, currency=self.currency)
        self.client = APIClient(); self.client.force_authenticate(self.user)

    def test_inventory_summary_and_valuation_use_controlled_balances(self):
        response = self.client.get("/api/shop/inventory-report/", {"shop": self.shop.pk})
        self.assertEqual(response.status_code, 200, response.data)
        self.assertEqual(response.data["summary"]["total_units"], "5.0000")
        self.assertEqual(response.data["summary"]["near_expiry"], 1)
        self.assertEqual(response.data["summary"]["valuation_by_currency"], [{"currency": "AFN", "value": "500.00"}])
        self.assertEqual(response.data["balances"][0]["status"], "NEAR_EXPIRY")
        self.assertEqual(Decimal(response.data["movements"][0]["quantity_in"]), Decimal("5"))

    def test_other_branch_is_not_accessible(self):
        other = get_user_model().objects.create_user(username="other-inventory")
        other_shop = Shop.objects.create(owner=other, name="Herat")
        response = self.client.get("/api/shop/inventory-report/", {"shop": other_shop.pk})
        self.assertEqual(response.status_code, 400)
