from django.core.management.base import BaseCommand
from django.contrib.auth import get_user_model
from role.models import Role, RoleAssignment
from django.utils import timezone

User = get_user_model()

class Command(BaseCommand):
    help = 'Create example admin users with different roles and permissions'

    def handle(self, *args, **options):
        self.stdout.write('Creating example admin users...')
        
        # Get or create roles
        super_admin_role = self.get_or_create_role('Super Admin', 'admin')
        ketua_role = self.get_or_create_role('Ketua Umum', 'ketua')
        sekretaris_role = self.get_or_create_role('Sekretaris Umum', 'sekretaris')
        bendahara_role = self.get_or_create_role('Bendahara Umum', 'bendahara')
        web_admin_role = self.get_or_create_role('Web Administrator', 'staff')
        inventaris_admin_role = self.get_or_create_role('Admin Inventaris', 'staff')
        
        # Create example users
        self.create_super_admin(super_admin_role)
        self.create_ketua(ketua_role)
        self.create_sekretaris(sekretaris_role)
        self.create_bendahara(bendahara_role)
        self.create_web_admin(web_admin_role)
        self.create_inventaris_admin(inventaris_admin_role)
        
        self.stdout.write(
            self.style.SUCCESS('Example admin users created successfully!')
        )

    def get_or_create_role(self, name, role_type):
        """Get or create role"""
        role, created = Role.objects.get_or_create(
            name=name,
            defaults={
                'role_type': role_type,
                'description': f'Role untuk {name}',
                'is_active': True
            }
        )
        return role

    def create_super_admin(self, role):
        """Create Super Administrator"""
        user_data = {
            'username': 'superadmin',
            'email': 'superadmin@hmi.com',
            'nama_lengkap': 'Dr. Ahmad Super Admin',
            'nim': 'ADMIN001',
            'tempat_lahir': 'Medan',
            'tanggal_lahir': '1990-01-01',
            'alamat': 'Jl. Admin No. 1, Medan',
            'no_telepon': '+62-61-1234567',
            'is_staff': True,
            'is_superuser': True,
            'is_approved': True,
            'status': 'aktif',
            'bio': 'Super Administrator dengan akses penuh ke semua fitur sistem HMI'
        }
        
        user, created = User.objects.get_or_create(
            username=user_data['username'],
            defaults=user_data
        )
        
        if created:
            user.set_password('superadmin123')
            user.save()
            self.assign_role(user, role, 'Super Administrator dengan akses penuh')
            self.stdout.write(
                self.style.SUCCESS(f'Created Super Admin: {user.nama_lengkap}')
            )
        else:
            self.stdout.write(
                self.style.WARNING(f'Super Admin already exists: {user.nama_lengkap}')
            )

    def create_ketua(self, role):
        """Create Ketua Umum"""
        user_data = {
            'username': 'ketua_umum',
            'email': 'ketua@hmi.com',
            'nama_lengkap': 'Muhammad Ketua Umum',
            'nim': 'ADMIN002',
            'tempat_lahir': 'Medan',
            'tanggal_lahir': '1992-05-15',
            'alamat': 'Jl. Ketua No. 2, Medan',
            'no_telepon': '+62-61-2345678',
            'is_staff': True,
            'is_superuser': False,
            'is_approved': True,
            'status': 'aktif',
            'bio': 'Ketua Umum HMI dengan wewenang penuh dalam pengambilan keputusan'
        }
        
        user, created = User.objects.get_or_create(
            username=user_data['username'],
            defaults=user_data
        )
        
        if created:
            user.set_password('ketua123')
            user.save()
            self.assign_role(user, role, 'Ketua Umum dengan wewenang kepemimpinan')
            self.stdout.write(
                self.style.SUCCESS(f'Created Ketua: {user.nama_lengkap}')
            )
        else:
            self.stdout.write(
                self.style.WARNING(f'Ketua already exists: {user.nama_lengkap}')
            )

    def create_sekretaris(self, role):
        """Create Sekretaris Umum"""
        user_data = {
            'username': 'sekretaris_umum',
            'email': 'sekretaris@hmi.com',
            'nama_lengkap': 'Siti Sekretaris Umum',
            'nim': 'ADMIN003',
            'tempat_lahir': 'Medan',
            'tanggal_lahir': '1993-03-20',
            'alamat': 'Jl. Sekretaris No. 3, Medan',
            'no_telepon': '+62-61-3456789',
            'is_staff': True,
            'is_superuser': False,
            'is_approved': True,
            'status': 'aktif',
            'bio': 'Sekretaris Umum HMI yang mengelola administrasi dan dokumentasi'
        }
        
        user, created = User.objects.get_or_create(
            username=user_data['username'],
            defaults=user_data
        )
        
        if created:
            user.set_password('sekretaris123')
            user.save()
            self.assign_role(user, role, 'Sekretaris Umum dengan akses administrasi')
            self.stdout.write(
                self.style.SUCCESS(f'Created Sekretaris: {user.nama_lengkap}')
            )
        else:
            self.stdout.write(
                self.style.WARNING(f'Sekretaris already exists: {user.nama_lengkap}')
            )

    def create_bendahara(self, role):
        """Create Bendahara Umum"""
        user_data = {
            'username': 'bendahara_umum',
            'email': 'bendahara@hmi.com',
            'nama_lengkap': 'Ahmad Bendahara Umum',
            'nim': 'ADMIN004',
            'tempat_lahir': 'Medan',
            'tanggal_lahir': '1991-08-10',
            'alamat': 'Jl. Bendahara No. 4, Medan',
            'no_telepon': '+62-61-4567890',
            'is_staff': True,
            'is_superuser': False,
            'is_approved': True,
            'status': 'aktif',
            'bio': 'Bendahara Umum HMI yang mengelola keuangan organisasi'
        }
        
        user, created = User.objects.get_or_create(
            username=user_data['username'],
            defaults=user_data
        )
        
        if created:
            user.set_password('bendahara123')
            user.save()
            self.assign_role(user, role, 'Bendahara Umum dengan akses keuangan')
            self.stdout.write(
                self.style.SUCCESS(f'Created Bendahara: {user.nama_lengkap}')
            )
        else:
            self.stdout.write(
                self.style.WARNING(f'Bendahara already exists: {user.nama_lengkap}')
            )

    def create_web_admin(self, role):
        """Create Web Administrator"""
        user_data = {
            'username': 'web_admin',
            'email': 'webadmin@hmi.com',
            'nama_lengkap': 'Tech Web Administrator',
            'nim': 'ADMIN005',
            'tempat_lahir': 'Medan',
            'tanggal_lahir': '1994-12-05',
            'alamat': 'Jl. Web Admin No. 5, Medan',
            'no_telepon': '+62-61-5678901',
            'is_staff': True,
            'is_superuser': False,
            'is_approved': True,
            'status': 'aktif',
            'bio': 'Web Administrator yang mengelola website dan sistem digital HMI'
        }
        
        user, created = User.objects.get_or_create(
            username=user_data['username'],
            defaults=user_data
        )
        
        if created:
            user.set_password('webadmin123')
            user.save()
            self.assign_role(user, role, 'Web Administrator dengan akses sistem')
            self.stdout.write(
                self.style.SUCCESS(f'Created Web Admin: {user.nama_lengkap}')
            )
        else:
            self.stdout.write(
                self.style.WARNING(f'Web Admin already exists: {user.nama_lengkap}')
            )

    def create_inventaris_admin(self, role):
        """Create Inventaris Administrator"""
        user_data = {
            'username': 'admin_inventaris',
            'email': 'inventaris@hmi.com',
            'nama_lengkap': 'Budi Inventaris Admin',
            'nim': 'INV999',
            'tempat_lahir': 'Medan',
            'tanggal_lahir': '1992-05-15',
            'alamat': 'Jl. Inventaris No. 1, Medan',
            'no_telepon': '+62-61-1234567',
            'is_staff': True,
            'is_superuser': False,
            'is_approved': True,
            'status': 'aktif',
            'bio': 'Admin Inventaris yang mengelola barang dan aset HMI'
        }
        
        user, created = User.objects.get_or_create(
            username=user_data['username'],
            defaults=user_data
        )
        
        if created:
            user.set_password('inventaris123')
            user.save()
            self.assign_role(user, role, 'Admin Inventaris dengan akses manajemen barang')
            self.stdout.write(
                self.style.SUCCESS(f'Created Inventaris Admin: {user.nama_lengkap}')
            )
        else:
            self.stdout.write(
                self.style.WARNING(f'Inventaris Admin already exists: {user.nama_lengkap}')
            )

    def assign_role(self, user, role, notes):
        """Assign role to user"""
        RoleAssignment.objects.get_or_create(
            user=user,
            role=role,
            defaults={
                'is_active': True,
                'notes': notes
            }
        )
