from decimal import Decimal

from django.contrib.auth import get_user_model
from django.core.management.base import BaseCommand
from django.db import transaction
from django.utils import timezone
from django.utils.text import slugify

from apps.business.marketplace.models import Brand, Category, SubCategory, Vendor, VendorInventory
from apps.business.products.models import Product
from apps.geo.models import FranchiseStore, FranchiseStoreInventory


class Command(BaseCommand):
    help = "Seed high-volume marketplace product catalog with vendor and franchise inventory for admin load testing"

    def add_arguments(self, parser):
        parser.add_argument("--products", type=int, default=500)
        parser.add_argument("--vendor-count", type=int, default=8)
        parser.add_argument("--start-index", type=int, default=1)
        parser.add_argument("--admin-mobile", type=str, default="8668192080")

    @transaction.atomic
    def handle(self, *args, **options):
        product_count = max(1, int(options["products"]))
        vendor_count = max(1, int(options["vendor_count"]))
        start_index = max(1, int(options["start_index"]))
        admin_mobile = options["admin_mobile"]

        User = get_user_model()

        admin_user, _ = User.objects.get_or_create(
            mobile=admin_mobile,
            defaults={
                "email": f"admin{admin_mobile}@truewave.local",
                "first_name": "Main",
                "last_name": "Admin",
                "is_staff": True,
                "is_superuser": True,
                "role": "ADMIN",
                "is_mobile_verified": True,
            },
        )

        categories = [
            ("health-wellness", "Health & Wellness"),
            ("daily-grocery", "Daily Grocery"),
            ("home-care", "Home Care"),
            ("personal-care", "Personal Care"),
            ("fitness", "Fitness"),
        ]
        subcategories = [
            ("health-wellness", "supplements", "Supplements"),
            ("health-wellness", "immunity", "Immunity"),
            ("daily-grocery", "staples", "Staples"),
            ("daily-grocery", "beverages", "Beverages"),
            ("home-care", "cleaning", "Cleaning"),
            ("personal-care", "hygiene", "Hygiene"),
            ("fitness", "nutrition", "Nutrition"),
        ]

        category_by_slug = {}
        for slug, name in categories:
            category, _ = Category.objects.get_or_create(
                slug=slug,
                defaults={"name": name, "is_active": True},
            )
            category_by_slug[slug] = category

        subcategory_rows = []
        for parent_slug, slug, name in subcategories:
            sub, _ = SubCategory.objects.get_or_create(
                category=category_by_slug[parent_slug],
                slug=slug,
                defaults={"name": name, "is_active": True},
            )
            subcategory_rows.append(sub)

        brands = []
        for i in range(1, 16):
            slug = f"tw-brand-{i:02d}"
            brand, _ = Brand.objects.get_or_create(
                slug=slug,
                defaults={"name": f"Truewave Brand {i:02d}", "is_active": True},
            )
            brands.append(brand)

        vendors = []
        for i in range(1, vendor_count + 1):
            mobile = f"9100002{i:03d}"
            user, _ = User.objects.get_or_create(
                mobile=mobile,
                defaults={
                    "email": f"catalog.vendor{i}@truewave.local",
                    "first_name": "Catalog",
                    "last_name": f"Vendor {i}",
                    "role": "VENDOR",
                    "is_mobile_verified": True,
                },
            )
            vendor, _ = Vendor.objects.get_or_create(
                user=user,
                defaults={
                    "company_name": f"Catalog Vendor {i} Pvt Ltd",
                    "company_registration_number": f"CATVND{i:05d}",
                    "tax_id": f"GSTCATV{i:05d}",
                    "business_email": f"vendor{i}@catalog.truewave.local",
                    "business_phone": f"9900003{i:03d}",
                    "business_address": "Catalog Street, Hyderabad",
                    "city": "Hyderabad",
                    "state": "Telangana",
                    "pincode": "500081",
                    "country": "India",
                    "store_name": f"Catalog Vendor Store {i}",
                    "status": "APPROVED",
                    "is_active": True,
                    "approval_date": timezone.now(),
                },
            )
            if vendor.status != "APPROVED" or not vendor.is_active:
                vendor.status = "APPROVED"
                vendor.is_active = True
                vendor.approval_date = timezone.now()
                vendor.save(update_fields=["status", "is_active", "approval_date", "updated_at"])
            vendors.append(vendor)

        store = FranchiseStore.objects.order_by("created_at").first()
        if store is None:
            store = FranchiseStore.objects.create(
                code="FS-LOAD-001",
                name="Load Test Franchise Store",
                address_line1="Load Test Address",
                contact_name="Load Test",
                contact_mobile=admin_mobile,
            )

        created = 0
        reused = 0
        for n in range(start_index, start_index + product_count):
            vendor = vendors[(n - start_index) % len(vendors)]
            category = category_by_slug[categories[(n - start_index) % len(categories)][0]]
            subcategory = subcategory_rows[(n - start_index) % len(subcategory_rows)]
            brand = brands[(n - start_index) % len(brands)]

            slug = slugify(f"tw-load-product-{n:06d}")
            sku = f"TWM-LOAD-{n:06d}"
            base_cost = Decimal("149.00") + Decimal((n % 90) * 10)
            mrp = base_cost + Decimal("120.00")

            product, is_created = Product.objects.get_or_create(
                slug=slug,
                defaults={
                    "name": f"Load Product {n:06d}",
                    "category": Product.Category.PHYSICAL,
                    "product_type": Product.ProductType.STANDARD,
                    "description": "Bulk-seeded catalog item for admin listing and analytics load tests.",
                    "base_cost": base_cost,
                    "gst_percentage": Decimal("18.000"),
                    "sku": sku,
                    "mrp": mrp,
                    "marketplace_category": category,
                    "marketplace_subcategory": subcategory,
                    "brand": brand,
                    "vendor": vendor,
                    "vendor_managed": True,
                    "franchise_fulfilled": True,
                    "marketplace_status": "ACTIVE",
                    "is_active": True,
                    "is_featured": n % 10 == 0,
                },
            )
            if is_created:
                created += 1
            else:
                reused += 1

            VendorInventory.objects.update_or_create(
                vendor=vendor,
                product=product,
                defaults={
                    "stock": 300 + (n % 200),
                    "reserved_stock": 20 + (n % 10),
                    "reorder_point": 25,
                    "last_restocked": timezone.now(),
                },
            )

            FranchiseStoreInventory.objects.update_or_create(
                store=store,
                product=product,
                defaults={
                    "stock": 240 + (n % 180),
                    "reserved_stock": 15 + (n % 8),
                    "reorder_point": 20,
                    "max_stock_level": 900,
                    "auto_reorder": True,
                    "last_restocked": timezone.now(),
                },
            )

        self.stdout.write(self.style.SUCCESS("Catalog load seed completed."))
        self.stdout.write(
            self.style.SUCCESS(
                f"products_requested={product_count} created={created} reused={reused} vendors={len(vendors)} store={store.code}"
            )
        )
