from django.core.management.base import BaseCommand
from django.contrib.auth import get_user_model
from inventaris.models import (
    KategoriBarang, Lokasi, Kondisi, Merk, Barang,
    Peminjaman, Perawatan, Penghapusan, LaporanInventaris
)
from django.utils import timezone
from datetime import datetime, timedelta
import random

User = get_user_model()


class Command(BaseCommand):
    help = 'Create dummy data for inventaris app'

    def add_arguments(self, parser):
        parser.add_argument(
            '--count',
            type=int,
            default=50,
            help='Number of barang to create (default: 50)'
        )

    def handle(self, *args, **options):
        count = options['count']
        
        self.stdout.write('Creating dummy data for inventaris...')
        
        # Create master data first
        self.create_master_data()
        
        # Create barang
        self.create_barang(count)
        
        # Create peminjaman
        self.create_peminjaman()
        
        # Create perawatan
        self.create_perawatan()
        
        # Create laporan
        self.create_laporan()
        
        self.stdout.write(
            self.style.SUCCESS(f'Successfully created dummy data for inventaris!')
        )

    def create_master_data(self):
        """Create master data (kategori, lokasi, kondisi, merk)"""
        
        # Kategori Barang
        kategori_data = [
            {'kode': 'ELK', 'nama': 'Elektronik', 'deskripsi': 'Perangkat elektronik'},
            {'kode': 'FUR', 'nama': 'Furniture', 'deskripsi': 'Perabotan kantor'},
            {'kode': 'ATK', 'nama': 'Alat Tulis Kantor', 'deskripsi': 'Peralatan tulis menulis'},
            {'kode': 'IT', 'nama': 'IT Equipment', 'deskripsi': 'Perangkat teknologi informasi'},
            {'kode': 'CLE', 'nama': 'Cleaning', 'deskripsi': 'Alat kebersihan'},
            {'kode': 'SEC', 'nama': 'Security', 'deskripsi': 'Perangkat keamanan'},
            {'kode': 'GEN', 'nama': 'General', 'deskripsi': 'Barang umum'},
        ]
        
        for data in kategori_data:
            try:
                kategori, created = KategoriBarang.objects.get_or_create(
                    kode=data['kode'],
                    defaults=data
                )
                if created:
                    self.stdout.write(f'Created kategori: {kategori.nama}')
            except Exception as e:
                self.stdout.write(f'Kategori {data["nama"]} already exists or error: {e}')

        # Lokasi
        lokasi_data = [
            {'kode': 'GDG', 'nama': 'Gudang', 'deskripsi': 'Gudang utama', 'gedung': 'Gedung A', 'lantai': '1', 'ruangan': 'Gudang'},
            {'kode': 'KNT', 'nama': 'Kantor', 'deskripsi': 'Kantor utama', 'gedung': 'Gedung A', 'lantai': '2', 'ruangan': 'Kantor'},
            {'kode': 'LAB', 'nama': 'Laboratorium', 'deskripsi': 'Lab komputer', 'gedung': 'Gedung B', 'lantai': '1', 'ruangan': 'Lab'},
            {'kode': 'LIB', 'nama': 'Perpustakaan', 'deskripsi': 'Perpustakaan', 'gedung': 'Gedung B', 'lantai': '2', 'ruangan': 'Perpus'},
            {'kode': 'AUL', 'nama': 'Aula', 'deskripsi': 'Aula utama', 'gedung': 'Gedung C', 'lantai': '1', 'ruangan': 'Aula'},
            {'kode': 'CAF', 'nama': 'Kantin', 'deskripsi': 'Kantin', 'gedung': 'Gedung C', 'lantai': '1', 'ruangan': 'Kantin'},
        ]
        
        for data in lokasi_data:
            try:
                lokasi, created = Lokasi.objects.get_or_create(
                    kode=data['kode'],
                    defaults=data
                )
                if created:
                    self.stdout.write(f'Created lokasi: {lokasi.nama}')
            except Exception as e:
                self.stdout.write(f'Lokasi {data["nama"]} already exists or error: {e}')

        # Kondisi
        kondisi_data = [
            {'nama': 'Baru', 'kondisi': 'baru', 'deskripsi': 'Barang baru', 'warna': '#28a745'},
            {'nama': 'Baik', 'kondisi': 'baik', 'deskripsi': 'Kondisi baik', 'warna': '#17a2b8'},
            {'nama': 'Cukup Baik', 'kondisi': 'cukup', 'deskripsi': 'Kondisi cukup baik', 'warna': '#ffc107'},
            {'nama': 'Rusak Ringan', 'kondisi': 'rusak_ringan', 'deskripsi': 'Rusak ringan', 'warna': '#fd7e14'},
            {'nama': 'Rusak Berat', 'kondisi': 'rusak_berat', 'deskripsi': 'Rusak berat', 'warna': '#dc3545'},
            {'nama': 'Hilang', 'kondisi': 'hilang', 'deskripsi': 'Barang hilang', 'warna': '#6c757d'},
        ]
        
        for data in kondisi_data:
            try:
                kondisi, created = Kondisi.objects.get_or_create(
                    kondisi=data['kondisi'],
                    defaults=data
                )
                if created:
                    self.stdout.write(f'Created kondisi: {kondisi.nama}')
            except Exception as e:
                self.stdout.write(f'Kondisi {data["nama"]} already exists or error: {e}')

        # Merk
        merk_data = [
            {'nama': 'Dell', 'deskripsi': 'Dell Technologies', 'website': 'https://dell.com'},
            {'nama': 'HP', 'deskripsi': 'Hewlett Packard', 'website': 'https://hp.com'},
            {'nama': 'Lenovo', 'deskripsi': 'Lenovo Group', 'website': 'https://lenovo.com'},
            {'nama': 'Samsung', 'deskripsi': 'Samsung Electronics', 'website': 'https://samsung.com'},
            {'nama': 'Canon', 'deskripsi': 'Canon Inc', 'website': 'https://canon.com'},
            {'nama': 'Epson', 'deskripsi': 'Epson Corporation', 'website': 'https://epson.com'},
            {'nama': 'IKEA', 'deskripsi': 'IKEA Group', 'website': 'https://ikea.com'},
            {'nama': 'Steelcase', 'deskripsi': 'Steelcase Inc', 'website': 'https://steelcase.com'},
            {'nama': 'Generic', 'deskripsi': 'Merk umum', 'website': ''},
        ]
        
        for data in merk_data:
            try:
                merk, created = Merk.objects.get_or_create(
                    nama=data['nama'],
                    defaults=data
                )
                if created:
                    self.stdout.write(f'Created merk: {merk.nama}')
            except Exception as e:
                self.stdout.write(f'Merk {data["nama"]} already exists or error: {e}')

    def create_barang(self, count):
        """Create barang dummy data"""
        
        # Get master data
        kategoris = list(KategoriBarang.objects.all())
        lokasis = list(Lokasi.objects.all())
        kondisis = list(Kondisi.objects.all())
        merks = list(Merk.objects.all())
        
        # Get or create admin user
        admin_user, created = User.objects.get_or_create(
            username='admin',
            defaults={
                'email': 'admin@hmi.com',
                'nama_lengkap': 'Administrator',
                'is_staff': True,
                'is_superuser': True
            }
        )
        
        # Barang templates
        barang_templates = [
            # Elektronik
            {'kategori': 'ELK', 'items': [
                {'nama': 'Laptop Dell Inspiron', 'model': 'Inspiron 15 3000', 'merk': 'Dell'},
                {'nama': 'Laptop HP Pavilion', 'model': 'Pavilion 14', 'merk': 'HP'},
                {'nama': 'Laptop Lenovo ThinkPad', 'model': 'ThinkPad E15', 'merk': 'Lenovo'},
                {'nama': 'Monitor Samsung', 'model': 'S24F350', 'merk': 'Samsung'},
                {'nama': 'Monitor Dell', 'model': 'SE2419H', 'merk': 'Dell'},
                {'nama': 'Keyboard Logitech', 'model': 'K120', 'merk': 'Generic'},
                {'nama': 'Mouse Logitech', 'model': 'M100', 'merk': 'Generic'},
                {'nama': 'Speaker Creative', 'model': 'T15', 'merk': 'Generic'},
            ]},
            # Furniture
            {'kategori': 'FUR', 'items': [
                {'nama': 'Meja Kantor', 'model': 'Office Desk', 'merk': 'IKEA'},
                {'nama': 'Kursi Kantor', 'model': 'Office Chair', 'merk': 'Steelcase'},
                {'nama': 'Lemari Arsip', 'model': 'File Cabinet', 'merk': 'IKEA'},
                {'nama': 'Rak Buku', 'model': 'Book Shelf', 'merk': 'IKEA'},
                {'nama': 'Meja Meeting', 'model': 'Conference Table', 'merk': 'Steelcase'},
                {'nama': 'Kursi Meeting', 'model': 'Conference Chair', 'merk': 'Steelcase'},
            ]},
            # ATK
            {'kategori': 'ATK', 'items': [
                {'nama': 'Pulpen', 'model': 'Ballpoint', 'merk': 'Generic'},
                {'nama': 'Pensil', 'model': '2B', 'merk': 'Generic'},
                {'nama': 'Penghapus', 'model': 'Eraser', 'merk': 'Generic'},
                {'nama': 'Penggaris', 'model': '30cm', 'merk': 'Generic'},
                {'nama': 'Stapler', 'model': 'Heavy Duty', 'merk': 'Generic'},
                {'nama': 'Kertas A4', 'model': '80gsm', 'merk': 'Generic'},
            ]},
            # IT Equipment
            {'kategori': 'IT', 'items': [
                {'nama': 'Router TP-Link', 'model': 'Archer C7', 'merk': 'Generic'},
                {'nama': 'Switch Cisco', 'model': 'Catalyst 2960', 'merk': 'Generic'},
                {'nama': 'Access Point Ubiquiti', 'model': 'UniFi AP', 'merk': 'Generic'},
                {'nama': 'UPS APC', 'model': 'Back-UPS 1000', 'merk': 'Generic'},
                {'nama': 'Kabel LAN', 'model': 'Cat6', 'merk': 'Generic'},
                {'nama': 'Harddisk External', 'model': '1TB', 'merk': 'Generic'},
            ]},
            # Cleaning
            {'kategori': 'CLE', 'items': [
                {'nama': 'Vacuum Cleaner', 'model': 'Portable', 'merk': 'Generic'},
                {'nama': 'Mop', 'model': 'Floor Mop', 'merk': 'Generic'},
                {'nama': 'Ember', 'model': 'Plastic Bucket', 'merk': 'Generic'},
                {'nama': 'Sapu', 'model': 'Broom', 'merk': 'Generic'},
                {'nama': 'Kemoceng', 'model': 'Feather Duster', 'merk': 'Generic'},
            ]},
            # Security
            {'kategori': 'SEC', 'items': [
                {'nama': 'CCTV Camera', 'model': 'IP Camera', 'merk': 'Generic'},
                {'nama': 'DVR', 'model': '4 Channel', 'merk': 'Generic'},
                {'nama': 'Alarm System', 'model': 'Wireless', 'merk': 'Generic'},
                {'nama': 'Fire Extinguisher', 'model': 'Dry Chemical', 'merk': 'Generic'},
            ]},
        ]
        
        created_count = 0
        for template in barang_templates:
            kategori = next((k for k in kategoris if k.kode == template['kategori']), None)
            if not kategori:
                continue
                
            for item in template['items']:
                if created_count >= count:
                    break
                    
                merk = next((m for m in merks if m.nama == item['merk']), merks[0])
                
                # Generate unique kode barang
                kode_barang = f"{kategori.kode}-{created_count+1:03d}"
                
                barang, created = Barang.objects.get_or_create(
                    kode_barang=kode_barang,
                    defaults={
                        'nama': item['nama'],
                        'kategori': kategori,
                        'merk': merk,
                        'model': item['model'],
                        'nomor_seri': f"SN{random.randint(100000, 999999)}",
                        'spesifikasi': f"Spesifikasi untuk {item['nama']}",
                        'tahun_perolehan': random.randint(2020, 2024),
                        'harga_perolehan': random.randint(100000, 5000000),
                        'kondisi': random.choice(kondisis),
                        'lokasi': random.choice(lokasis),
                        'status': random.choice(['aktif', 'aktif', 'aktif', 'dipinjam', 'rusak']),
                        'keterangan': f"Barang {item['nama']} untuk keperluan kantor",
                        'created_by': admin_user,
                    }
                )
                
                if created:
                    created_count += 1
                    self.stdout.write(f'Created barang: {barang.nama}')
        
        self.stdout.write(f'Created {created_count} barang items')

    def create_peminjaman(self):
        """Create peminjaman dummy data"""
        
        # Get users
        users = list(User.objects.all())
        if not users:
            # Create some users if none exist
            for i in range(5):
                user, created = User.objects.get_or_create(
                    username=f'user{i+1}',
                    defaults={
                        'email': f'user{i+1}@hmi.com',
                        'nama_lengkap': f'User {i+1}',
                        'is_staff': False,
                    }
                )
                if created:
                    users.append(user)
        
        # Get barang yang aktif
        barang_list = list(Barang.objects.filter(status='aktif')[:20])
        kondisis = list(Kondisi.objects.all())
        
        # Get admin user
        admin_user = User.objects.filter(is_superuser=True).first()
        
        peminjaman_data = [
            {'keperluan': 'Keperluan meeting', 'status': 'dipinjam'},
            {'keperluan': 'Presentasi', 'status': 'dikembalikan'},
            {'keperluan': 'Kerja lapangan', 'status': 'pending'},
            {'keperluan': 'Training', 'status': 'disetujui'},
            {'keperluan': 'Event', 'status': 'dipinjam'},
        ]
        
        created_count = 0
        for i in range(min(15, len(barang_list))):
            barang = barang_list[i]
            user = random.choice(users)
            data = random.choice(peminjaman_data)
            
            tanggal_pinjam = timezone.now().date() - timedelta(days=random.randint(1, 30))
            tanggal_kembali_rencana = tanggal_pinjam + timedelta(days=random.randint(1, 7))
            
            peminjaman, created = Peminjaman.objects.get_or_create(
                barang=barang,
                peminjam=user,
                tanggal_pinjam=tanggal_pinjam,
                defaults={
                    'tanggal_kembali_rencana': tanggal_kembali_rencana,
                    'tanggal_kembali_aktual': tanggal_kembali_rencana if data['status'] == 'dikembalikan' else None,
                    'keperluan': data['keperluan'],
                    'status': data['status'],
                    'kondisi_saat_pinjam': random.choice(kondisis),
                    'kondisi_saat_kembali': random.choice(kondisis) if data['status'] == 'dikembalikan' else None,
                    'approved_by': admin_user if data['status'] in ['disetujui', 'dipinjam', 'dikembalikan'] else None,
                }
            )
            
            if created:
                created_count += 1
                self.stdout.write(f'Created peminjaman: {peminjaman.barang.nama} - {peminjaman.peminjam.nama_lengkap}')
        
        self.stdout.write(f'Created {created_count} peminjaman records')

    def create_perawatan(self):
        """Create perawatan dummy data"""
        
        barang_list = list(Barang.objects.all()[:20])
        kondisis = list(Kondisi.objects.all())
        admin_user = User.objects.filter(is_superuser=True).first()
        
        jenis_perawatan = ['preventif', 'korektif', 'pembersihan', 'kalibrasi', 'upgrade']
        
        created_count = 0
        for i in range(min(10, len(barang_list))):
            barang = barang_list[i]
            
            tanggal_perawatan = timezone.now().date() - timedelta(days=random.randint(1, 60))
            
            perawatan, created = Perawatan.objects.get_or_create(
                barang=barang,
                tanggal_perawatan=tanggal_perawatan,
                jenis_perawatan=random.choice(jenis_perawatan),
                defaults={
                    'deskripsi': f'Perawatan {random.choice(jenis_perawatan)} untuk {barang.nama}',
                    'biaya': random.randint(50000, 500000),
                    'teknisi': f'Teknisi {random.randint(1, 5)}',
                    'kondisi_sebelum': random.choice(kondisis),
                    'kondisi_sesudah': random.choice(kondisis),
                    'created_by': admin_user,
                }
            )
            
            if created:
                created_count += 1
                self.stdout.write(f'Created perawatan: {perawatan.barang.nama} - {perawatan.jenis_perawatan}')
        
        self.stdout.write(f'Created {created_count} perawatan records')

    def create_laporan(self):
        """Create laporan dummy data"""
        
        admin_user = User.objects.filter(is_superuser=True).first()
        
        jenis_laporan = ['stock_opname', 'kondisi_barang', 'peminjaman', 'perawatan', 'penghapusan', 'kategori', 'lokasi']
        
        created_count = 0
        for i in range(5):
            jenis = random.choice(jenis_laporan)
            periode_dari = timezone.now().date() - timedelta(days=30)
            periode_sampai = timezone.now().date()
            
            laporan, created = LaporanInventaris.objects.get_or_create(
                judul=f'Laporan {jenis.replace("_", " ").title()} {i+1}',
                jenis_laporan=jenis,
                periode_dari=periode_dari,
                periode_sampai=periode_sampai,
                defaults={
                    'catatan': f'Laporan {jenis.replace("_", " ")} untuk periode {periode_dari} sampai {periode_sampai}',
                    'created_by': admin_user,
                }
            )
            
            if created:
                created_count += 1
                self.stdout.write(f'Created laporan: {laporan.judul}')
        
        self.stdout.write(f'Created {created_count} laporan records')
