"""
Django management command to create a default admin user.

This command creates a default superuser account if no users exist in the system.
It's designed to be run automatically during deployment to ensure there's always
an admin user available for initial access.
"""

from django.core.management.base import BaseCommand
from django.contrib.auth.models import User
from django.db import transaction
from django.conf import settings
from decouple import config
import logging

logger = logging.getLogger(__name__)


class Command(BaseCommand):
    help = 'Create a default admin user if no users exist'

    def add_arguments(self, parser):
        parser.add_argument(
            '--username',
            type=str,
            default=config('DEFAULT_ADMIN_USERNAME', default='admin'),
            help='Username for the default admin user (default: admin)'
        )
        parser.add_argument(
            '--email',
            type=str,
            default=config('DEFAULT_ADMIN_EMAIL', default='admin@example.com'),
            help='Email for the default admin user (default: admin@example.com)'
        )
        parser.add_argument(
            '--password',
            type=str,
            default=config('DEFAULT_ADMIN_PASSWORD', default='admin123'),
            help='Password for the default admin user (default: admin123)'
        )
        parser.add_argument(
            '--force',
            action='store_true',
            help='Force creation even if users already exist'
        )

    def handle(self, *args, **options):
        username = options['username']
        email = options['email']
        password = options['password']
        force = options['force']

        try:
            with transaction.atomic():
                # Check if the specific username already exists
                if User.objects.filter(username=username).exists():
                    if not force:
                        self.stdout.write(
                            self.style.SUCCESS(
                                f'Default admin user "{username}" already exists. Skipping creation.'
                            )
                        )
                        return
                    else:
                        # Delete existing user if force is specified
                        User.objects.filter(username=username).delete()
                        self.stdout.write(
                            self.style.WARNING(f'Deleted existing user "{username}"')
                        )

                # Check if any users exist (only warn, don't prevent creation)
                user_count = User.objects.count()
                if user_count > 0:
                    self.stdout.write(
                        self.style.WARNING(
                            f'Other users already exist ({user_count} users found). '
                            'Creating default admin anyway.'
                        )
                    )

                # Create the default admin user
                user = User.objects.create_superuser(
                    username=username,
                    email=email,
                    password=password
                )

                self.stdout.write(
                    self.style.SUCCESS(
                        f'Successfully created default admin user: "{username}"'
                    )
                )
                
                # Log the creation for audit purposes
                logger.info(
                    f'Default admin user created: {username} ({email})',
                    extra={
                        'username': username,
                        'email': email,
                        'user_id': user.id,
                        'action': 'create_default_user'
                    }
                )

                # Security warning for production
                if not settings.DEBUG:
                    self.stdout.write(
                        self.style.WARNING(
                            '\n' + '='*60 + '\n'
                            'SECURITY WARNING: Default admin user created!\n'
                            'Please change the default password immediately!\n'
                            f'Username: {username}\n'
                            f'Email: {email}\n'
                            'Login at: /admin/\n'
                            '='*60
                        )
                    )
                else:
                    self.stdout.write(
                        self.style.SUCCESS(
                            f'\nDefault admin user created for development:\n'
                            f'Username: {username}\n'
                            f'Password: {password}\n'
                            f'Email: {email}\n'
                            f'Login at: http://localhost:8000/admin/'
                        )
                    )

        except Exception as e:
            self.stdout.write(
                self.style.ERROR(f'Failed to create default user: {str(e)}')
            )
            logger.error(
                f'Failed to create default user: {str(e)}',
                extra={
                    'username': username,
                    'email': email,
                    'error': str(e),
                    'action': 'create_default_user_failed'
                }
            )
            raise
