from django.core.management.base import BaseCommand
from django.contrib.auth import get_user_model
from organisations.models import Organisation, OrganisationBranch, UserRole
from users.models import Staff, UserAssignedRole

User = get_user_model()

class Command(BaseCommand):
    help = 'Create UNCDF partner user'

    def add_arguments(self, parser):
        parser.add_argument(
            '--username',
            type=str,
            default='uncdf_partner',
            help='Username for the UNCDF partner user'
        )
        parser.add_argument(
            '--password',
            type=str,
            default='uncdf_password_2024',
            help='Password for the UNCDF partner user'
        )
        parser.add_argument(
            '--email',
            type=str,
            default='uncdf@finwise.org',
            help='Email for the UNCDF partner user'
        )

    def handle(self, *args, **options):
        username = options['username']
        password = options['password']
        email = options['email']
        
        # Get Finwise organization
        try:
            finwise_org = Organisation.objects.get(id=139)
            self.stdout.write(
                self.style.SUCCESS(f'Found Finwise organization: {finwise_org.name}')
            )
        except Organisation.DoesNotExist:
            self.stdout.write(
                self.style.ERROR('Finwise organization (ID: 139) not found')
            )
            return
            
        # Get Finwise branch
        finwise_branch = OrganisationBranch.objects.filter(
            branch_organisation=finwise_org
        ).first()
        
        if not finwise_branch:
            self.stdout.write(
                self.style.ERROR('Finwise branch not found')
            )
            return
            
        self.stdout.write(
            self.style.SUCCESS(f'Found Finwise branch: {finwise_branch.name}')
        )
        
        # Check if user already exists
        if User.objects.filter(username=username).exists():
            self.stdout.write(
                self.style.WARNING(f'User {username} already exists')
            )
            return
            
        # Create staff record
        staff = Staff.objects.create(
            name='UNCDF Partner User',
            email=email,
            phone_number='+256700000000',
            staff_organisation=finwise_org,
            status='active',
            is_active=True
        )
        
        self.stdout.write(
            self.style.SUCCESS(f'Created staff record: {staff.name}')
        )
        
        # Create partner role
        partner_role = UserRole.objects.create(
            role_name='partner',
            role_desc='UNCDF Partner Access',
            role_type='partner',
            partner_name='UNCDF',
            role_org=finwise_org,
            role_added_by=1,  # Superuser ID
            is_active=True
        )
        
        self.stdout.write(
            self.style.SUCCESS(f'Created partner role: {partner_role.role_name}')
        )
        
        # Create user
        user = User.objects.create_user(
            username=username,
            email=email,
            password=password,
            user_organisation_branch=finwise_branch,
            user_staff=staff,
            is_active=True
        )
        
        self.stdout.write(
            self.style.SUCCESS(f'Created user: {user.username}')
        )
        
        # Assign partner role
        UserAssignedRole.objects.create(
            user=user,
            assigned_role=partner_role,
            assigned_role_added_by=User.objects.get(id=1),  # Superuser
            is_active=True
        )
        
        self.stdout.write(
            self.style.SUCCESS(f'Assigned partner role to user: {user.username}')
        )
        
        # Create PartnerAccess record
        from organisations.models import PartnerAccess
        PartnerAccess.objects.create(
            user=user,
            partner_name='UNCDF',
            allowed_endpoints=[
                '/api/uncdf-dashboard/',
                '/api/token-auth/',
                '/api/verify-otp/',
            ],
            is_active=True,
            created_by=User.objects.get(id=1)  # Superuser
        )
        
        self.stdout.write(
            self.style.SUCCESS(f'Created partner access record for: {user.username}')
        )
        
        self.stdout.write(
            self.style.SUCCESS(
                f'\n✅ Successfully created UNCDF partner user!\n'
                f'Username: {username}\n'
                f'Password: {password}\n'
                f'Email: {email}\n'
                f'Organization: {finwise_org.name}\n'
                f'Branch: {finwise_branch.name}\n'
                f'Role: {partner_role.role_name} ({partner_role.partner_name})\n'
                f'\nThe user can now access the UNCDF dashboard at: /api/uncdf-dashboard/'
            )
        )
