"""
Django management command to bulk create users from the spreadsheet.

Usage:
    python manage.py bulk_create_users

Place this file in: apps/authentication/management/commands/bulk_create_users.py
"""

from django.core.management.base import BaseCommand
from django.db import transaction
from django.contrib.auth import get_user_model
from apps.authentication.models import Role, UserProfile
from apps.business.models import Business, BusinessMembership, Location
import logging

logger = logging.getLogger(__name__)
User = get_user_model()


class Command(BaseCommand):
    help = 'Bulk create users from spreadsheet data'

    def handle(self, *args, **options):
        """Execute the bulk user creation"""
        
        # Configuration
        BUSINESS_ID = "26ef493a-63bd-450c-907a-0b8f020c0f03"
        LOCATION_ID = "c8f5e1af-06de-456a-9fa7-a7b6-99e8c718"
        DEFAULT_PASSWORD = "test123"
        
        # User data from spreadsheet
        users_data = [
            {
                'email': 'pndungu@gmail.com',
                'first_name': 'Peter',
                'last_name': "Ndung'u",
                'username': "pndung'u",
                'role': 'ADMIN'
            },
            # {
            #     'email': 'admin@binbyte.com',
            #     'first_name': 'admin',
            #     'last_name': '',
            #     'username': 'admin',
            #     'role': 'CLIENT'
            # },
            # {
            #     'email': 'sales@onetechcomputers.co.ke',
            #     'first_name': 'Main',
            #     'last_name': 'Account',
            #     'username': 'sales',
            #     'role': 'SALES_AGENT'
            # },
            # {
            #     'email': 'ephantus@gmail.com',
            #     'first_name': 'EPHANTUS',
            #     'last_name': "NDUNGU'U",
            #     'username': 'EPHANTUS',
            #     'role': 'SALES_AGENT'
            # },
            # {
            #     'email': 'sam@onetech.co.ke',
            #     'first_name': 'SAMUEL',
            #     'last_name': 'GITHINJI',
            #     'username': 'SAMUEL',
            #     'role': 'SALES_AGENT'
            # },
            # {
            #     'email': 'shii@onetech.co.ke',
            #     'first_name': 'ESTHER',
            #     'last_name': 'WANJIRU',
            #     'username': 'ESTHER',
            #     'role': 'SALES_AGENT'
            # },
            # {
            #     'email': 'pkaruma@onetech.co.ke',
            #     'first_name': 'KARUMA',
            #     'last_name': 'KARUMA',
            #     'username': 'KARUMA',
            #     'role': 'SALES_AGENT'
            # },
            # {
            #     'email': 'maggy@onetech.co.ke',
            #     'first_name': 'MAGGY',
            #     'last_name': 'MAGGY',
            #     'username': 'MAGGY',
            #     'role': 'SALES_AGENT'
            # },
            # {
            #     'email': 'maureen@onetech.com',
            #     'first_name': 'maureen',
            #     'last_name': 'maureen',
            #     'username': 'maureen',
            #     'role': 'SALES_AGENT'
            # },
            # {
            #     'email': 'shiko@onetech.com',
            #     'first_name': 'Shiko',
            #     'last_name': 'Shiko',
            #     'username': 'Shiko',
            #     'role': 'MANAGER'
            # },
            # {
            #     'email': 'HGFHG@dtid.com',
            #     'first_name': 'PAUL',
            #     'last_name': 'PAUL',
            #     'username': 'PAUL',
            #     'role': 'SALES_AGENT'
            # },
            # {
            #     'email': 'CHELSEA@onetech.com',
            #     'first_name': 'CHELSEA',
            #     'last_name': 'CHELSEA',
            #     'username': 'CHELSEA',
            #     'role': 'SALES_AGENT'
            # },
            # {
            #     'email': 'admin@yellowapple.com',
            #     'first_name': 'Admin',
            #     'last_name': 'YellowApple',
            #     'username': 'admin1',
            #     'role': 'SALES_AGENT'
            # },
            # {
            #     'email': 'sales@yellowapple.com',
            #     'first_name': 'Sales',
            #     'last_name': 'YellowApple',
            #     'username': 'NULL',
            #     'role': 'SALES_AGENT'
            # },
            # {
            #     'email': 'Wairimu@onetech.com',
            #     'first_name': 'Wairimu',
            #     'last_name': 'Wairimu',
            #     'username': 'Wairimu',
            #     'role': 'SALES_AGENT'
            # },
            # {
            #     'email': 'njuguna@gmail.com',
            #     'first_name': 'Njuguna',
            #     'last_name': 'Njuguna',
            #     'username': 'Njuguna',
            #     'role': 'SALES_AGENT'
            # },
            # {
            #     'email': 'stella@onetech.com',
            #     'first_name': 'Stella',
            #     'last_name': 'Wamboi',
            #     'username': 'Stella',
            #     'role': 'SALES_AGENT'
            # },
            # {
            #     'email': 'ruth@onetech.com',
            #     'first_name': 'Ruth',
            #     'last_name': 'Ruth',
            #     'username': 'Ruth',
            #     'role': 'SALES_AGENT'
            # },
            # {
            #     'email': 'vinnie@onetech.co.ke',
            #     'first_name': 'Vinnie',
            #     'last_name': 'Vinnie',
            #     'username': 'Vinnie',
            #     'role': 'SALES_AGENT'
            # },
            # {
            #     'email': 'grace@onetech.co.ke',
            #     'first_name': 'Grace',
            #     'last_name': 'Grace',
            #     'username': 'Grace',
            #     'role': 'SALES_AGENT'
            # }
        ]

        try:
            with transaction.atomic():
                # Get business and location
                business = Business.objects.get(id=BUSINESS_ID)
                location = Location.objects.get(id=LOCATION_ID)
                
                self.stdout.write(self.style.SUCCESS(
                    f'✓ Found business: {business.name}'
                ))
                self.stdout.write(self.style.SUCCESS(
                    f'✓ Found location: {location.name}'
                ))
                
                # Process each user
                created_count = 0
                skipped_count = 0
                
                for user_data in users_data:
                    email = user_data['email']
                    
                    # Check if user already exists
                    if User.objects.filter(email=email).exists():
                        self.stdout.write(self.style.WARNING(
                            f'⊘ Skipping {email} - already exists'
                        ))
                        skipped_count += 1
                        continue
                    
                    # Get or create role
                    role_name = user_data.get('role', 'SALES_AGENT')
                    try:
                        role = Role.objects.get(
                            name=role_name,
                            business=business
                        )
                    except Role.DoesNotExist:
                        self.stdout.write(self.style.WARNING(
                            f'⚠ Role {role_name} not found for {email}, using SALES_AGENT'
                        ))
                        role = Role.objects.get(
                            name='SALES_AGENT',
                            business=business
                        )
                    
                    # Create username (ensure uniqueness)
                    base_username = user_data['username'] or email.split('@')[0]
                    username = base_username
                    counter = 1
                    while User.objects.filter(username=username).exists():
                        username = f"{base_username}{counter}"
                        counter += 1
                    
                    # Create user
                    user = User.objects.create_user(
                        username=username,
                        email=email,
                        password=DEFAULT_PASSWORD,
                        first_name=user_data['first_name'],
                        last_name=user_data['last_name'],
                        phone_number='',  # Empty for now
                        is_email_verified=False,  # Since emails don't work
                        onboarding_completed=True,
                        profile_completed=True,
                        business_setup_completed=True
                    )
                    
                    # Create user profile
                    UserProfile.objects.create(
                        user=user,
                        preferred_language='en',
                        theme_preference='light'
                    )
                    
                    # Create business membership
                    membership = BusinessMembership.objects.create(
                        user=user,
                        business=business,
                        role=role,
                        status='ACTIVE',
                        is_primary=True,
                        can_access_all_locations=True,
                        invitation_accepted=True,
                        is_active=True
                    )
                    
                    # Add location access
                    membership.accessible_locations.add(location)
                    
                    created_count += 1
                    self.stdout.write(self.style.SUCCESS(
                        f'✓ Created user: {email} ({role_name})'
                    ))
                
                # Summary
                self.stdout.write(self.style.SUCCESS(
                    f'\n{"="*60}'
                ))
                self.stdout.write(self.style.SUCCESS(
                    f'✓ Bulk user creation completed!'
                ))
                self.stdout.write(self.style.SUCCESS(
                    f'  - Created: {created_count} users'
                ))
                self.stdout.write(self.style.SUCCESS(
                    f'  - Skipped: {skipped_count} users (already exist)'
                ))
                self.stdout.write(self.style.SUCCESS(
                    f'  - Business: {business.name}'
                ))
                self.stdout.write(self.style.SUCCESS(
                    f'  - Location: {location.name}'
                ))
                self.stdout.write(self.style.SUCCESS(
                    f'  - Default password: {DEFAULT_PASSWORD}'
                ))
                self.stdout.write(self.style.SUCCESS(
                    f'{"="*60}\n'
                ))
                
        except Business.DoesNotExist:
            self.stdout.write(self.style.ERROR(
                f'✗ Business with ID {BUSINESS_ID} not found!'
            ))
        except Location.DoesNotExist:
            self.stdout.write(self.style.ERROR(
                f'✗ Location with ID {LOCATION_ID} not found!'
            ))
        except Exception as e:
            self.stdout.write(self.style.ERROR(
                f'✗ Error: {str(e)}'
            ))
            import traceback
            self.stdout.write(self.style.ERROR(traceback.format_exc()))