import random
from datetime import date, timedelta
from django.core.management.base import BaseCommand
from django.contrib.auth import get_user_model
from apps.hr.models import Employee
from apps.asset_management.models import (
    Asset, AssetCategory, AssetLocation, AssetAssignment,
    Maintenance, Vendor, Procurement, AssetTicket,
)

User = get_user_model()

# ── Reference data ────────────────────────────────────────────────────────────

CATEGORIES = [
    {"name": "IT Equipment", "depreciation_rate": 25},
    {"name": "Mobile Devices", "depreciation_rate": 33},
    {"name": "Peripherals", "depreciation_rate": 20},
    {"name": "Furniture", "depreciation_rate": 10},
    {"name": "Vehicles", "depreciation_rate": 20},
    {"name": "Office Equipment", "depreciation_rate": 15},
    {"name": "Audio / Visual", "depreciation_rate": 20},
]

LOCATIONS = [
    {"name": "HQ Jakarta", "address": "Jl. Sudirman No. 1, Jakarta Selatan, Gedung Utama Lt. 5"},
    {"name": "Bandung Office", "address": "Jl. Asia Afrika No. 10, Bandung, Graha Bandung Lt. 3"},
    {"name": "Surabaya Branch", "address": "Jl. Pemuda No. 22, Surabaya, Menara Surabaya Lt. 8"},
    {"name": "Server Room", "address": "Jl. Sudirman No. 1, Jakarta Selatan, Gedung Utama B1"},
    {"name": "Warehouse", "address": "Jl. Industri No. 5, Bekasi, Gudang A Lt. 1"},
]

VENDORS = [
    {"name": "PT Datascrip", "contact_person": "Budi Santoso", "email": "budi@datascrip.co.id", "phone": "021-5551234", "address": "Jakarta Selatan, DKI Jakarta 12190", "tax_id": "01.234.567.8-000.001"},
    {"name": "PT Synnex Metrodata", "contact_person": "Dewi Kartika", "email": "dewi@synnexmetrodata.co.id", "phone": "021-5552345", "address": "Jakarta Pusat, DKI Jakarta 10350", "tax_id": "01.234.567.8-000.002"},
    {"name": "PT ACER Indonesia", "contact_person": "Agus Setiawan", "email": "agus@acer.co.id", "phone": "021-5553456", "address": "Jakarta Barat, DKI Jakarta 11440", "tax_id": "01.234.567.8-000.003"},
    {"name": "PT Apple Indonesia", "contact_person": "Rina Putri", "email": "rina@apple.co.id", "phone": "021-5554567", "address": "Jakarta Selatan, DKI Jakarta 12920", "tax_id": "01.234.567.8-000.004"},
    {"name": "PT Lenovo Indonesia", "contact_person": "Hendra Wijaya", "email": "hendra@lenovo.co.id", "phone": "021-5555678", "address": "Tangerang, Banten 15811", "tax_id": "01.234.567.8-000.005"},
    {"name": "UD Furniture Jaya", "contact_person": "Sari Indah", "email": "sari@furnjaya.co.id", "phone": "021-5556789", "address": "Bekasi, Jawa Barat 17148", "tax_id": "01.234.567.8-000.006"},
    {"name": "PT Toyota Astra Motor", "contact_person": "Fajar Nugroho", "email": "fajar@toyota.co.id", "phone": "021-5557890", "address": "Jakarta Timur, DKI Jakarta 13930", "tax_id": "01.234.567.8-000.007"},
]

# subcategory / department / condition kept inside specifications JSON — not model fields.
ASSETS = [
    {
        "name": "MacBook Pro 14\" M3 Pro",
        "category": "IT Equipment",
        "serial_number": "C02XG2JHQ6LZ",
        "purchase_price": 32000000,
        "status": "assigned",
        "warranty_months": 12,
        "vendor_idx": 3,
        "specs": {"subcategory": "Laptop", "department": "Technology", "condition": "good", "processor": "Apple M3 Pro", "ram": "18GB", "storage": "512GB SSD", "display": "14.2 inch Liquid Retina"},
    },
    {
        "name": "Dell XPS 15 9530",
        "category": "IT Equipment",
        "serial_number": "DXPS15-SN-88421",
        "purchase_price": 26000000,
        "status": "assigned",
        "warranty_months": 24,
        "vendor_idx": 0,
        "specs": {"subcategory": "Laptop", "department": "Research", "condition": "good", "processor": "Intel Core i7-13700H", "ram": "16GB DDR5", "storage": "512GB NVMe", "display": "15.6 inch OLED"},
    },
    {
        "name": "ThinkPad X1 Carbon Gen 11",
        "category": "IT Equipment",
        "serial_number": "TP-X1-C11-55239",
        "purchase_price": 24000000,
        "status": "assigned",
        "warranty_months": 36,
        "vendor_idx": 4,
        "specs": {"subcategory": "Laptop", "department": "Finance", "condition": "fair", "processor": "Intel Core i5-1335U", "ram": "16GB LPDDR5", "storage": "256GB SSD", "display": "14 inch IPS"},
    },
    {
        "name": "iPhone 15 Pro Max",
        "category": "Mobile Devices",
        "serial_number": "IPH15PM-SN-77612",
        "purchase_price": 22000000,
        "status": "assigned",
        "warranty_months": 12,
        "vendor_idx": 3,
        "specs": {"subcategory": "Smartphone", "department": "Executive", "condition": "good", "os": "iOS 17", "storage": "256GB", "color": "Black Titanium", "chip": "A17 Pro"},
    },
    {
        "name": "iPad Pro 12.9\" M2",
        "category": "Mobile Devices",
        "serial_number": "IPAD-M2-SN-34521",
        "purchase_price": 18000000,
        "status": "available",
        "warranty_months": 12,
        "vendor_idx": 3,
        "specs": {"subcategory": "Tablet", "department": "Marketing", "condition": "good", "os": "iPadOS 17", "storage": "128GB", "connectivity": "WiFi + Cellular", "chip": "Apple M2"},
    },
    {
        "name": "LG UltraWide Monitor 34\"",
        "category": "Peripherals",
        "serial_number": "LGUW34-SN-90123",
        "purchase_price": 8500000,
        "status": "assigned",
        "warranty_months": 36,
        "vendor_idx": 1,
        "specs": {"subcategory": "Monitor", "department": "Technology", "condition": "good", "resolution": "3440x1440", "refresh_rate": "144Hz", "panel": "IPS"},
    },
    {
        "name": "Sony WH-1000XM5 Headset",
        "category": "Peripherals",
        "serial_number": "SONY-XM5-SN-22301",
        "purchase_price": 4500000,
        "status": "assigned",
        "warranty_months": 12,
        "vendor_idx": 1,
        "specs": {"subcategory": "Headset", "department": "Technology", "condition": "good", "type": "Over-ear", "connectivity": "Bluetooth 5.2", "battery": "30 hours"},
    },
    {
        "name": "Herman Miller Aeron Chair",
        "category": "Furniture",
        "serial_number": "HM-AERON-SN-11234",
        "purchase_price": 15000000,
        "status": "assigned",
        "warranty_months": 144,
        "vendor_idx": 5,
        "specs": {"subcategory": "Chair", "department": "Executive", "condition": "good", "size": "Size B", "color": "Graphite", "armrest": "4D"},
    },
    {
        "name": "Standing Desk Flexispot E7",
        "category": "Furniture",
        "serial_number": "FLX-E7-SN-56781",
        "purchase_price": 8000000,
        "status": "assigned",
        "warranty_months": 60,
        "vendor_idx": 5,
        "specs": {"subcategory": "Desk", "department": "Technology", "condition": "good", "size": "160x80 cm", "color": "White", "motor": "Dual motor"},
    },
    {
        "name": "Toyota Innova Zenix 2023",
        "category": "Vehicles",
        "serial_number": "MHFGB8EM0P4023441",
        "purchase_price": 420000000,
        "status": "assigned",
        "warranty_months": 36,
        "vendor_idx": 6,
        "specs": {"subcategory": "Car", "department": "Operations", "condition": "good", "engine": "2.0L HEV", "transmission": "E-CVT", "color": "Silver Metallic", "seats": "7", "plate_number": "B 1234 KHB"},
    },
    {
        "name": "Canon imageRUNNER 2730i",
        "category": "Office Equipment",
        "serial_number": "CNIR2730-SN-88120",
        "purchase_price": 35000000,
        "status": "available",
        "warranty_months": 12,
        "vendor_idx": 0,
        "specs": {"subcategory": "Printer", "department": "Administration", "condition": "good", "type": "Laser MFP", "speed": "30 ppm", "paper_size": "A3"},
    },
    {
        "name": "Epson EB-2250U Projector",
        "category": "Office Equipment",
        "serial_number": "EPS-EB2250-SN-44312",
        "purchase_price": 18000000,
        "status": "available",
        "warranty_months": 24,
        "vendor_idx": 1,
        "specs": {"subcategory": "Projector", "department": "Administration", "condition": "good", "brightness": "5000 lumens", "resolution": "WUXGA 1920x1200"},
    },
    {
        "name": "MacBook Air 2019 (Retired)",
        "category": "IT Equipment",
        "serial_number": "C02XR2JHJGH7",
        "purchase_price": 18000000,
        "status": "retired",
        "warranty_months": 12,
        "vendor_idx": 3,
        "specs": {"subcategory": "Laptop", "department": "Technology", "condition": "fair", "processor": "Intel Core i5", "ram": "8GB", "storage": "256GB SSD"},
    },
    {
        "name": "Dell Latitude 5520 (In Maintenance)",
        "category": "IT Equipment",
        "serial_number": "DLLT5520-SN-33219",
        "purchase_price": 19000000,
        "status": "maintenance",
        "warranty_months": 24,
        "vendor_idx": 0,
        "specs": {"subcategory": "Laptop", "department": "Finance", "condition": "damaged", "processor": "Intel Core i5-1145G7", "ram": "16GB", "storage": "512GB SSD"},
    },
]

MAINTENANCE_TEMPLATES = [
    {"title": "Annual Cleaning & Checkup", "cost_range": (200000, 500000)},
    {"title": "Battery Replacement", "cost_range": (500000, 1500000)},
    {"title": "Software Update & Optimization", "cost_range": (150000, 300000)},
    {"title": "Hardware Inspection", "cost_range": (100000, 250000)},
    {"title": "Screen Replacement", "cost_range": (1500000, 4000000)},
    {"title": "Oil Change & Tune-up", "cost_range": (500000, 1200000)},
    {"title": "Toner / Ink Replacement", "cost_range": (300000, 800000)},
]

PROCUREMENTS = [
    {"title": "MacBook Pro M3 for Engineering Team", "category": "IT Equipment", "status": "approved", "quantity": 5, "estimated_cost": 25000000, "actual_cost": 24500000, "delivery_offset": 14, "notes": "Replacing aging laptops for senior engineers."},
    {"title": "Standing Desks for Design Department", "category": "Furniture", "status": "ordered", "quantity": 8, "estimated_cost": 12000000, "actual_cost": 11800000, "delivery_offset": 7, "notes": "Ergonomic upgrade for design team."},
    {"title": "Network Switch 24-Port", "category": "IT Equipment", "status": "received", "quantity": 2, "estimated_cost": 5000000, "actual_cost": 4800000, "delivery_offset": -10, "notes": "Expansion for server room."},
    {"title": "Office Chairs — Batch 3", "category": "Furniture", "status": "pending_approval", "quantity": 20, "estimated_cost": 30000000, "actual_cost": None, "delivery_offset": None, "notes": "New hire batch Q2."},
    {"title": "Projector for Conference Room B", "category": "Audio / Visual", "status": "draft", "quantity": 1, "estimated_cost": 8500000, "actual_cost": None, "delivery_offset": None, "notes": "4K projector for client presentations."},
    {"title": "Wireless Headsets for Support Team", "category": "Peripherals", "status": "approved", "quantity": 15, "estimated_cost": 9000000, "actual_cost": None, "delivery_offset": 21, "notes": "For customer support department upgrade."},
    {"title": "UPS Units for Server Room", "category": "IT Equipment", "status": "cancelled", "quantity": 4, "estimated_cost": 16000000, "actual_cost": None, "delivery_offset": None, "notes": "Cancelled — budget reallocated to cloud infrastructure."},
]

TICKETS = [
    {"title": "MacBook Pro keyboard not responding", "priority": "high", "status": "open", "asset_idx": 0, "description": "Keys randomly stop working after extended use. Suspected hardware fault."},
    {"title": "Dell XPS screen flickering", "priority": "medium", "status": "in_progress", "asset_idx": 1, "description": "Screen flickers at random intervals, worse under bright lighting."},
    {"title": "ThinkPad battery draining fast", "priority": "low", "status": "resolved", "asset_idx": 2, "description": "Battery life dropped to under 2 hours. May need replacement."},
    {"title": "iPad Pro touchscreen unresponsive", "priority": "high", "status": "open", "asset_idx": 4, "description": "Lower half of touchscreen not registering touches. Possible digitizer failure."},
    {"title": "LG Monitor dead pixels", "priority": "low", "status": "closed", "asset_idx": 5, "description": "Three dead pixels in center of screen. Reported for warranty replacement."},
    {"title": "Herman Miller chair gas lift failure", "priority": "medium", "status": "in_progress", "asset_idx": 7, "description": "Chair slowly sinks to lowest position. Pneumatic cylinder needs replacement."},
]


class Command(BaseCommand):
    help = "Seed asset management data (categories, locations, vendors, assets, assignments, maintenance, procurements, tickets)."

    def add_arguments(self, parser):
        parser.add_argument("--clear", action="store_true", help="Clear existing asset data before seeding")

    def handle(self, *args, **options):
        if options["clear"]:
            AssetTicket.objects.all().delete()
            Maintenance.objects.all().delete()
            AssetAssignment.objects.all().delete()
            Procurement.objects.all().delete()
            Asset.objects.all().delete()
            AssetCategory.objects.all().delete()
            AssetLocation.objects.all().delete()
            Vendor.objects.all().delete()
            self.stdout.write("Cleared existing asset data.")

        user = User.objects.filter(is_superuser=True).first() or User.objects.first()
        if not user:
            self.stdout.write(self.style.ERROR("No users found — create a superuser first."))
            return

        employees = list(Employee.objects.all())
        if not employees:
            self.stdout.write(self.style.WARNING("No employees found — assets will have no assignments. Run seed_employees first."))

        # ── Categories ───────────────────────────────────────────────────────
        cat_map = {}
        for c in CATEGORIES:
            cat, _ = AssetCategory.objects.get_or_create(
                name=c["name"],
                defaults={
                    "description": f"{c['name']} assets",
                    "depreciation_rate": c["depreciation_rate"],
                },
            )
            cat_map[c["name"]] = cat
        self.stdout.write(f"  Categories: {len(cat_map)}")

        # ── Locations ────────────────────────────────────────────────────────
        loc_list = []
        for l in LOCATIONS:
            loc, _ = AssetLocation.objects.get_or_create(
                name=l["name"],
                defaults={
                    "address": l["address"],
                    "contact_person": "Facility Manager",
                    "contact_phone": "021-5550000",
                },
            )
            loc_list.append(loc)
        self.stdout.write(f"  Locations: {len(loc_list)}")

        # ── Vendors ──────────────────────────────────────────────────────────
        vendor_objs = []
        for v in VENDORS:
            vendor, _ = Vendor.objects.update_or_create(
                name=v["name"],
                defaults={
                    "contact_person": v["contact_person"],
                    "email": v["email"],
                    "phone": v["phone"],
                    "address": v["address"],
                    "tax_id": v["tax_id"],
                },
            )
            vendor_objs.append(vendor)
        self.stdout.write(f"  Vendors: {len(vendor_objs)}")

        # ── Assets ───────────────────────────────────────────────────────────
        asset_objs = []
        employee_pool = employees[:]
        random.shuffle(employee_pool)

        for i, a in enumerate(ASSETS):
            tag = f"AST-2024{i + 1:04d}"
            existing = Asset.objects.filter(asset_tag=tag).first()
            if existing:
                self.stdout.write(f"  Skip existing: {tag}")
                asset_objs.append(existing)
                continue

            purchase_date = date.today() - timedelta(days=random.randint(180, 730))
            warranty_expiry = purchase_date + timedelta(days=30 * a["warranty_months"])
            location = loc_list[i % len(loc_list)]
            vendor = vendor_objs[a["vendor_idx"]]
            specs = a["specs"]

            asset = Asset.objects.create(
                name=a["name"],
                asset_tag=tag,
                serial_number=a["serial_number"],
                category=cat_map[a["category"]],
                status=a["status"],
                location=location,
                vendor=vendor,
                purchase_date=purchase_date,
                purchase_price=a["purchase_price"],
                warranty_expiry=warranty_expiry,
                description=f"{a['name']} — {specs['subcategory']} used by {specs['department']} department.",
                specifications=specs,
            )
            asset_objs.append(asset)

            # ── Assignment ───────────────────────────────────────────────────
            if a["status"] == "assigned" and employee_pool:
                employee = employee_pool[i % len(employee_pool)]
                AssetAssignment.objects.create(
                    asset=asset,
                    employee=employee,
                    assigned_date=purchase_date + timedelta(days=random.randint(7, 30)),
                    status="assigned",
                    condition="Good",
                    notes="Initial assignment after procurement.",
                )

            # ── Maintenance records ──────────────────────────────────────────
            for _ in range(random.randint(1, 3)):
                tmpl = random.choice(MAINTENANCE_TEMPLATES)
                sched_date = purchase_date + timedelta(days=random.randint(60, 500))
                status_choice = random.choice(["completed", "completed", "scheduled", "in_progress"])
                Maintenance.objects.create(
                    asset=asset,
                    title=tmpl["title"],
                    description=f"{tmpl['title']} for {asset.name}.",
                    status=status_choice,
                    scheduled_date=sched_date,
                    completed_date=sched_date + timedelta(days=random.randint(1, 7)) if status_choice == "completed" else None,
                    cost=random.randint(*tmpl["cost_range"]) if status_choice == "completed" else None,
                    vendor=random.choice(vendor_objs).name,
                    notes="Routine service.",
                )

        self.stdout.write(f"  Assets: {len(asset_objs)}")

        # ── Procurements ─────────────────────────────────────────────────────
        proc_count = 0
        for p in PROCUREMENTS:
            delivery = (
                date.today() + timedelta(days=p["delivery_offset"])
                if p["delivery_offset"] is not None else None
            )
            Procurement.objects.create(
                title=p["title"],
                category=p["category"],
                description=f"Procurement request: {p['title']}.",
                status=p["status"],
                requested_by=user,
                quantity=p["quantity"],
                estimated_cost=p["estimated_cost"],
                actual_cost=p["actual_cost"],
                vendor=random.choice(vendor_objs),
                delivery_date=delivery,
                notes=p["notes"],
            )
            proc_count += 1
        self.stdout.write(f"  Procurements: {proc_count}")

        # ── Tickets ──────────────────────────────────────────────────────────
        ticket_count = 0
        for t in TICKETS:
            asset = asset_objs[t["asset_idx"]] if t["asset_idx"] < len(asset_objs) else None
            AssetTicket.objects.create(
                asset=asset,
                title=t["title"],
                description=t["description"],
                priority=t["priority"],
                status=t["status"],
                reported_by=user,
                notes="Logged via asset management system.",
            )
            ticket_count += 1
        self.stdout.write(f"  Tickets: {ticket_count}")

        self.stdout.write(self.style.SUCCESS("Done."))
