from django.core.management.base import BaseCommand
from django.contrib.auth import get_user_model
from django.utils import timezone
from role.models import Role, Permission
from inventaris.models import KategoriBarang, Lokasi, Kondisi, Merk

User = get_user_model()


class Command(BaseCommand):
    help = 'Initialize inventory system with default data'

    def add_arguments(self, parser):
        parser.add_argument(
            '--reset',
            action='store_true',
            help='Reset existing data before creating new data',
        )

    def handle(self, *args, **options):
        if options['reset']:
            self.stdout.write('Resetting existing inventory data...')
            KategoriBarang.objects.all().delete()
            Lokasi.objects.all().delete()
            Kondisi.objects.all().delete()
            Merk.objects.all().delete()
            Role.objects.filter(role_type__in=['inventaris_admin', 'inventaris_staff']).delete()
            Permission.objects.filter(module='inventaris').delete()

        self.stdout.write('Creating inventory roles...')
        self.create_inventory_roles()

        self.stdout.write('Creating default categories...')
        self.create_default_categories()

        self.stdout.write('Creating default locations...')
        self.create_default_locations()

        self.stdout.write('Creating default conditions...')
        self.create_default_conditions()

        self.stdout.write('Creating default brands...')
        self.create_default_brands()

        self.stdout.write('Creating inventory permissions...')
        self.create_inventory_permissions()

        self.stdout.write(
            self.style.SUCCESS('Inventory system initialized successfully!')
        )

    def create_inventory_roles(self):
        """Create inventory-specific roles"""
        roles_data = [
            {
                'name': 'Admin Inventaris',
                'role_type': 'inventaris_admin',
                'description': 'Administrator sistem inventaris dengan akses penuh',
                'permissions': [
                    'inventaris.view_barang',
                    'inventaris.add_barang',
                    'inventaris.change_barang',
                    'inventaris.delete_barang',
                    'inventaris.view_peminjaman',
                    'inventaris.add_peminjaman',
                    'inventaris.change_peminjaman',
                    'inventaris.delete_peminjaman',
                    'inventaris.approve_peminjaman',
                    'inventaris.view_perawatan',
                    'inventaris.add_perawatan',
                    'inventaris.change_perawatan',
                    'inventaris.delete_perawatan',
                    'inventaris.view_laporan',
                    'inventaris.add_laporan',
                    'inventaris.view_kategori',
                    'inventaris.add_kategori',
                    'inventaris.change_kategori',
                    'inventaris.delete_kategori',
                    'inventaris.view_lokasi',
                    'inventaris.add_lokasi',
                    'inventaris.change_lokasi',
                    'inventaris.delete_lokasi',
                    'inventaris.view_kondisi',
                    'inventaris.add_kondisi',
                    'inventaris.change_kondisi',
                    'inventaris.delete_kondisi',
                ]
            },
            {
                'name': 'Staff Inventaris',
                'role_type': 'inventaris_staff',
                'description': 'Staff inventaris dengan akses terbatas',
                'permissions': [
                    'inventaris.view_barang',
                    'inventaris.view_peminjaman',
                    'inventaris.add_peminjaman',
                    'inventaris.view_perawatan',
                    'inventaris.view_laporan',
                    'inventaris.view_kategori',
                    'inventaris.view_lokasi',
                    'inventaris.view_kondisi',
                ]
            }
        ]

        for role_data in roles_data:
            role, created = Role.objects.get_or_create(
                name=role_data['name'],
                defaults={
                    'role_type': role_data['role_type'],
                    'description': role_data['description'],
                    'permissions': role_data['permissions'],
                }
            )
            if created:
                self.stdout.write(f'  Created role: {role.name}')
            else:
                self.stdout.write(f'  Role already exists: {role.name}')

    def create_default_categories(self):
        """Create default categories"""
        categories_data = [
            {'kode': 'ELK', 'nama': 'Elektronik', 'deskripsi': 'Barang elektronik seperti laptop, printer, dll'},
            {'kode': 'FRN', 'nama': 'Furniture', 'deskripsi': 'Meja, kursi, lemari, dll'},
            {'kode': 'BKS', 'nama': 'Buku & Stationary', 'deskripsi': 'Buku, alat tulis, dll'},
            {'kode': 'SPT', 'nama': 'Sport & Recreation', 'deskripsi': 'Alat olahraga dan rekreasi'},
            {'kode': 'OTH', 'nama': 'Lainnya', 'deskripsi': 'Kategori lainnya'},
        ]

        for cat_data in categories_data:
            category, created = KategoriBarang.objects.get_or_create(
                kode=cat_data['kode'],
                defaults={
                    'nama': cat_data['nama'],
                    'deskripsi': cat_data['deskripsi'],
                }
            )
            if created:
                self.stdout.write(f'  Created category: {category.nama}')
            else:
                self.stdout.write(f'  Category already exists: {category.nama}')

    def create_default_locations(self):
        """Create default locations"""
        locations_data = [
            {'kode': 'G01', 'nama': 'Gedung Utama Lantai 1', 'gedung': 'Gedung Utama', 'lantai': '1'},
            {'kode': 'G02', 'nama': 'Gedung Utama Lantai 2', 'gedung': 'Gedung Utama', 'lantai': '2'},
            {'kode': 'G03', 'nama': 'Gedung Serbaguna', 'gedung': 'Gedung Serbaguna', 'lantai': '1'},
            {'kode': 'G04', 'nama': 'Ruang Sekretariat', 'gedung': 'Gedung Utama', 'lantai': '1', 'ruangan': '101'},
            {'kode': 'G05', 'nama': 'Ruang Bendahara', 'gedung': 'Gedung Utama', 'lantai': '1', 'ruangan': '102'},
        ]

        for loc_data in locations_data:
            location, created = Lokasi.objects.get_or_create(
                kode=loc_data['kode'],
                defaults=loc_data
            )
            if created:
                self.stdout.write(f'  Created location: {location.nama}')
            else:
                self.stdout.write(f'  Location already exists: {location.nama}')

    def create_default_conditions(self):
        """Create default conditions"""
        conditions_data = [
            {'nama': 'Baru', 'kondisi': 'baru', 'warna': '#28a745', 'deskripsi': 'Barang baru belum pernah digunakan'},
            {'nama': 'Baik', 'kondisi': 'baik', 'warna': '#007bff', 'deskripsi': 'Barang dalam kondisi baik, siap digunakan'},
            {'nama': 'Cukup Baik', 'kondisi': 'cukup', 'warna': '#ffc107', 'deskripsi': 'Barang masih bisa digunakan dengan baik'},
            {'nama': 'Rusak Ringan', 'kondisi': 'rusak_ringan', 'warna': '#fd7e14', 'deskripsi': 'Barang rusak ringan, perlu perbaikan kecil'},
            {'nama': 'Rusak Berat', 'kondisi': 'rusak_berat', 'warna': '#dc3545', 'deskripsi': 'Barang rusak berat, perlu perbaikan besar'},
            {'nama': 'Hilang', 'kondisi': 'hilang', 'warna': '#6c757d', 'deskripsi': 'Barang hilang atau tidak diketahui keberadaannya'},
        ]

        for cond_data in conditions_data:
            condition, created = Kondisi.objects.get_or_create(
                kondisi=cond_data['kondisi'],
                defaults=cond_data
            )
            if created:
                self.stdout.write(f'  Created condition: {condition.nama}')
            else:
                self.stdout.write(f'  Condition already exists: {condition.nama}')

    def create_default_brands(self):
        """Create default brands"""
        brands_data = [
            {'nama': 'Tidak Ada Merk', 'deskripsi': 'Barang tanpa merk spesifik'},
            {'nama': 'Lenovo', 'deskripsi': 'Laptop dan komputer Lenovo'},
            {'nama': 'HP', 'deskripsi': 'Produk Hewlett-Packard'},
            {'nama': 'Canon', 'deskripsi': 'Printer dan kamera Canon'},
            {'nama': 'Epson', 'deskripsi': 'Printer Epson'},
        ]

        for brand_data in brands_data:
            brand, created = Merk.objects.get_or_create(
                nama=brand_data['nama'],
                defaults=brand_data
            )
            if created:
                self.stdout.write(f'  Created brand: {brand.nama}')
            else:
                self.stdout.write(f'  Brand already exists: {brand.nama}')

    def create_inventory_permissions(self):
        """Create inventory permissions"""
        permissions_data = [
            {'name': 'Can view barang', 'codename': 'view_barang', 'permission_type': 'view', 'module': 'inventaris'},
            {'name': 'Can add barang', 'codename': 'add_barang', 'permission_type': 'add', 'module': 'inventaris'},
            {'name': 'Can change barang', 'codename': 'change_barang', 'permission_type': 'change', 'module': 'inventaris'},
            {'name': 'Can delete barang', 'codename': 'delete_barang', 'permission_type': 'delete', 'module': 'inventaris'},
            {'name': 'Can view peminjaman', 'codename': 'view_peminjaman', 'permission_type': 'view', 'module': 'inventaris'},
            {'name': 'Can add peminjaman', 'codename': 'add_peminjaman', 'permission_type': 'add', 'module': 'inventaris'},
            {'name': 'Can change peminjaman', 'codename': 'change_peminjaman', 'permission_type': 'change', 'module': 'inventaris'},
            {'name': 'Can delete peminjaman', 'codename': 'delete_peminjaman', 'permission_type': 'delete', 'module': 'inventaris'},
            {'name': 'Can approve peminjaman', 'codename': 'approve_peminjaman', 'permission_type': 'approve', 'module': 'inventaris'},
            {'name': 'Can view perawatan', 'codename': 'view_perawatan', 'permission_type': 'view', 'module': 'inventaris'},
            {'name': 'Can add perawatan', 'codename': 'add_perawatan', 'permission_type': 'add', 'module': 'inventaris'},
            {'name': 'Can change perawatan', 'codename': 'change_perawatan', 'permission_type': 'change', 'module': 'inventaris'},
            {'name': 'Can delete perawatan', 'codename': 'delete_perawatan', 'permission_type': 'delete', 'module': 'inventaris'},
            {'name': 'Can view laporan', 'codename': 'view_laporan', 'permission_type': 'view', 'module': 'inventaris'},
            {'name': 'Can add laporan', 'codename': 'add_laporan', 'permission_type': 'add', 'module': 'inventaris'},
            {'name': 'Can view kategori', 'codename': 'view_kategori', 'permission_type': 'view', 'module': 'inventaris'},
            {'name': 'Can add kategori', 'codename': 'add_kategori', 'permission_type': 'add', 'module': 'inventaris'},
            {'name': 'Can change kategori', 'codename': 'change_kategori', 'permission_type': 'change', 'module': 'inventaris'},
            {'name': 'Can delete kategori', 'codename': 'delete_kategori', 'permission_type': 'delete', 'module': 'inventaris'},
            {'name': 'Can view lokasi', 'codename': 'view_lokasi', 'permission_type': 'view', 'module': 'inventaris'},
            {'name': 'Can add lokasi', 'codename': 'add_lokasi', 'permission_type': 'add', 'module': 'inventaris'},
            {'name': 'Can change lokasi', 'codename': 'change_lokasi', 'permission_type': 'change', 'module': 'inventaris'},
            {'name': 'Can delete lokasi', 'codename': 'delete_lokasi', 'permission_type': 'delete', 'module': 'inventaris'},
            {'name': 'Can view kondisi', 'codename': 'view_kondisi', 'permission_type': 'view', 'module': 'inventaris'},
            {'name': 'Can add kondisi', 'codename': 'add_kondisi', 'permission_type': 'add', 'module': 'inventaris'},
            {'name': 'Can change kondisi', 'codename': 'change_kondisi', 'permission_type': 'change', 'module': 'inventaris'},
            {'name': 'Can delete kondisi', 'codename': 'delete_kondisi', 'permission_type': 'delete', 'module': 'inventaris'},
        ]

        for perm_data in permissions_data:
            permission, created = Permission.objects.get_or_create(
                codename=perm_data['codename'],
                defaults=perm_data
            )
            if created:
                self.stdout.write(f'  Created permission: {permission.name}')
            else:
                self.stdout.write(f'  Permission already exists: {permission.name}')
