from django.core.management.base import BaseCommand
from django.contrib.auth.models import User
from accounts.models import Employee
from django.db import transaction

class Command(BaseCommand):
    help = 'Creates test users for different roles'

    def handle(self, *args, **kwargs):
        # Test users data
        test_users = [
            {
                'username': 'test_hr',
                'email': 'hr@test.com',
                'password': 'hr123',
                'first_name': 'HR',
                'last_name': 'Test',
                'role': 'HR',
                'basic_pay': 10000.00,
            },
            {
                'username': 'test_employee',
                'email': 'employee@test.com',
                'password': 'emp123',
                'first_name': 'Employee',
                'last_name': 'Test',
                'role': 'EMP',
                'basic_pay': 5000.00,
            },
            {
                'username': 'test_registrar',
                'email': 'registrar@test.com',
                'password': 'reg123',
                'first_name': 'Registrar',
                'last_name': 'Test',
                'role': 'REG',
                'basic_pay': 8000.00,
            },
            {
                'username': 'test_finance',
                'email': 'finance@test.com',
                'password': 'fin123',
                'first_name': 'Finance',
                'last_name': 'Test',
                'role': 'FIN',
                'basic_pay': 7000.00,
            },
        ]

        # First, remove any existing test users
        self.stdout.write("Cleaning up any existing test users...")
        User.objects.filter(username__startswith='test_').delete()

        created_users = []
        for user_data in test_users:
            # Extract employee-specific data
            role = user_data.pop('role')
            basic_pay = user_data.pop('basic_pay')
            username = user_data.pop('username')
            password = user_data.pop('password')

            # Create user and employee in a transaction
            try:
                with transaction.atomic():
                    # Create user
                    user = User.objects.create_user(
                        username=username,
                        password=password,
                        **user_data
                    )
                    self.stdout.write(f"Created user: {username}")

                    # Create employee profile
                    employee = Employee.objects.create(
                        user=user,
                        role=role,
                        basic_pay=basic_pay,
                        annual_leave_days=24
                    )
                    self.stdout.write(f"Created employee profile for: {username}")
                    created_users.append(username)

            except Exception as e:
                self.stderr.write(f"Error creating {username}: {str(e)}")

        if created_users:
            self.stdout.write(self.style.SUCCESS("\nTest users created successfully!"))
            self.stdout.write("\nUsernames and passwords:")
            self.stdout.write("------------------------")
            self.stdout.write("HR: test_hr / hr123")
            self.stdout.write("Employee: test_employee / emp123")
            self.stdout.write("Registrar: test_registrar / reg123")
            self.stdout.write("Finance: test_finance / fin123")
        else:
            self.stdout.write(self.style.ERROR("\nNo new users were created."))
