from django.contrib.auth import get_user_model
from django.core.management.base import BaseCommand, CommandError


class Command(BaseCommand):
    help = 'Create or update default users: superadmin and normal user.'

    def add_arguments(self, parser):
        parser.add_argument(
            '--superadmin-username',
            type=str,
            default='superadmin',
            help='Username for the super admin user (default: superadmin)'
        )
        parser.add_argument(
            '--superadmin-password',
            type=str,
            default='superadmin123',
            help='Password for the super admin user (default: superadmin123)'
        )
        parser.add_argument(
            '--normal-username',
            type=str,
            default='user',
            help='Username for the normal user (default: user)'
        )
        parser.add_argument(
            '--normal-password',
            type=str,
            default='user123',
            help='Password for the normal user (default: user123)'
        )
        parser.add_argument(
            '--force',
            action='store_true',
            help='Force password reset for existing users'
        )

    def _create_or_update_user(self, UserModel, username, password, is_superuser=False, is_staff=False):
        if not username or not password:
            raise CommandError('Username and password are required')

        user, created = UserModel.objects.get_or_create(
            username=username,
            defaults={
                'is_superuser': is_superuser,
                'is_staff': is_staff,
                'is_active': True,
            }
        )

        if created:
            user.set_password(password)
            user.is_superuser = is_superuser
            user.is_staff = is_staff
            user.is_active = True
            user.save()
            self.stdout.write(self.style.SUCCESS(f"Created user: {username} (superuser={is_superuser}, staff={is_staff})"))
            return user, created

        updated = False

        if user.is_superuser != is_superuser:
            user.is_superuser = is_superuser
            updated = True
        if user.is_staff != is_staff:
            user.is_staff = is_staff
            updated = True
        if not user.is_active:
            user.is_active = True
            updated = True

        if updated:
            user.save()
            self.stdout.write(self.style.SUCCESS(f"Updated user flags: {username} (superuser={is_superuser}, staff={is_staff})"))

        return user, created

    def handle(self, *args, **options):
        UserModel = get_user_model()

        superadmin_username = options['superadmin_username']
        superadmin_password = options['superadmin_password']
        normal_username = options['normal_username']
        normal_password = options['normal_password']
        force = options['force']

        self.stdout.write('Creating default account users...')

        superadmin, sa_created = self._create_or_update_user(
            UserModel,
            superadmin_username,
            superadmin_password,
            is_superuser=True,
            is_staff=True,
        )

        normal, normal_created = self._create_or_update_user(
            UserModel,
            normal_username,
            normal_password,
            is_superuser=False,
            is_staff=False,
        )

        if force or sa_created:
            superadmin.set_password(superadmin_password)
            superadmin.save()
            self.stdout.write(self.style.SUCCESS(f"Set password for superadmin '{superadmin_username}'"))
        elif force:
            superadmin.set_password(superadmin_password)
            superadmin.save()
            self.stdout.write(self.style.SUCCESS(f"Reset password for superadmin '{superadmin_username}'"))

        if force or normal_created:
            normal.set_password(normal_password)
            normal.save()
            self.stdout.write(self.style.SUCCESS(f"Set password for normal user '{normal_username}'"))
        elif force:
            normal.set_password(normal_password)
            normal.save()
            self.stdout.write(self.style.SUCCESS(f"Reset password for normal user '{normal_username}'"))

        self.stdout.write(self.style.SUCCESS('Default users created/updated successfully.'))
