from django.core.management.base import BaseCommand
import random
from decimal import Decimal
from shop_management.models.data.shop import Shop
from shop_management.models.data.supplier import Supplier
from shop_management.models.data.customer import Customer
from shop_management.models.data.product import Category, Product
from shop_management.models.data.utils import Unit, Currency, PaymentStatus
from shop_management.models.data.purchase import Purchase, PurchaseItem
from shop_management.models.data.purchase_payment import PurchasePayment
from shop_management.models.data.sale import Sale, SaleItem
from shop_management.models.data.sale_payment import SalePayment
from shop_management.models.data.sale_return import SaleReturn, SaleReturnItem
from shop_management.models.data.stock import Stock
from django.contrib.auth import get_user_model


class Command(BaseCommand):
    help = "Populate database with 20 sample records for each model."

    def handle(self, *args, **options):
        User = get_user_model()
        user, _ = User.objects.get_or_create(
            username="demo_user",
            defaults={"email": "demo@example.com", "password": "demo"},
        )

        shop, _ = Shop.objects.get_or_create(
            owner=user, name="Demo Shop", defaults={"description": "A test shop"}
        )

        currency, _ = Currency.objects.get_or_create(
            title="USD", defaults={"description": "US Dollar"}
        )

        unit, _ = Unit.objects.get_or_create(
            title="Piece", defaults={"description": "One unit"}
        )

        for i in range(20):
            Supplier.objects.create(
                shop=shop,
                name=f"Supplier {i+1}",
                email=f"supplier{i+1}@example.com",
                contact="1234567890",
                address="123 Test Street",
            )

        for i in range(20):
            Customer.objects.create(
                shop=shop,
                name=f"Customer {i+1}",
                email=f"customer{i+1}@example.com",
                contact="0987654321",
                address="456 Sample Ave",
            )

        categories = []
        for i in range(20):
            cat = Category.objects.create(
                shop=shop, name=f"Category {i+1}", description="Category description"
            )
            categories.append(cat)

        products = []
        for i in range(20):
            prod = Product.objects.create(
                shop=shop,
                category=random.choice(categories),
                name=f"Product {i+1}",
                description="Product description",
            )
            products.append(prod)

        for i in range(20):
            purchase = Purchase.objects.create(
                shop=shop,
                supplier=random.choice(Supplier.objects.filter(shop=shop)),
                discount=Decimal(random.choice([0, 5, 10])),
                status=PaymentStatus.PENDING,
            )
            quantity = random.randint(1, 10)
            buy_price = Decimal(random.choice([10, 20, 30]))
            sale_price = buy_price + Decimal(5)

            PurchaseItem.objects.create(
                purchase=purchase,
                product=random.choice(products),
                unit=unit,
                quantity=quantity,
                buy_price=buy_price,
                sale_price=sale_price,
            )

            total_price = quantity * buy_price
            payment_amount = random.choice([total_price, total_price / 2, total_price])
            PurchasePayment.objects.create(
                purchase=purchase, currency=currency, amount=payment_amount
            )

        customers_list = list(Customer.objects.filter(shop=shop))
        for i in range(20):
            sale = Sale.objects.create(
                shop=shop,
                customer=random.choice(customers_list),
                discount=Decimal(random.choice([0, 5, 10])),
                status=PaymentStatus.PENDING,
            )
            quantity = random.randint(1, 10)
            sale_price = Decimal(random.choice([15, 25, 35]))

            SaleItem.objects.create(
                sale=sale,
                product=random.choice(products),
                quantity=quantity,
                unit=unit,
                sale_price=sale_price,
            )

            total_sale = quantity * sale_price
            payment_amount = random.choice([total_sale, total_sale / 2, total_sale])
            SalePayment.objects.create(
                sale=sale, currency=currency, amount=payment_amount
            )

        purchase_items = list(PurchaseItem.objects.all())
        for i in range(20):
            pi = random.choice(purchase_items)
            Stock.objects.create(
                shop=shop, purchase_item=pi, quantity=random.randint(1, 50)
            )

        sales = list(Sale.objects.filter(shop=shop))
        for i in range(20):
            sale_obj = random.choice(sales)
            sale_return = SaleReturn.objects.create(
                shop=shop, sale=sale_obj, reason="Customer return"
            )
            if sale_obj.sale_items.exists():
                sale_item = random.choice(list(sale_obj.sale_items.all()))
                return_qty = random.randint(1, sale_item.quantity)
                SaleReturnItem.objects.create(
                    sale_return=sale_return,
                    sale_item=sale_item,
                    return_quantity=return_qty,
                    refund_amount=None,  # auto-calculate if model has logic
                )

        self.stdout.write(self.style.SUCCESS("✅ Inserted 20 records for each model."))
