from __future__ import annotations

from django.contrib.auth import get_user_model
from django.core.management.base import BaseCommand

User = get_user_model()


class Command(BaseCommand):
    help = "Create or update demo users for each CRM auth role."

    def add_arguments(self, parser):
        parser.add_argument(
            "--password",
            default="DemoPass123!",
            help="Password for all generated demo users (default: DemoPass123!).",
        )

    def handle(self, *args, **options):
        password = options["password"]

        users = [
            {
                "username": "superadmin",
                "email": "superadmin@example.com",
                "first_name": "System",
                "last_name": "Admin",
                "role": User.Role.SUPERUSER,
                "is_staff": True,
                "is_superuser": True,
            },
            {
                "username": "engineer1",
                "email": "engineer1@example.com",
                "first_name": "Lead",
                "last_name": "Engineer",
                "role": User.Role.ENGINEERS,
                "is_staff": False,
                "is_superuser": False,
            },
            {
                "username": "accountant1",
                "email": "accountant1@example.com",
                "first_name": "Finance",
                "last_name": "Analyst",
                "role": User.Role.ACCOUNTANT,
                "is_staff": False,
                "is_superuser": False,
            },
            {
                "username": "pm1",
                "email": "pm1@example.com",
                "first_name": "Project",
                "last_name": "Manager",
                "role": User.Role.PROJECT_MANAGER,
                "is_staff": False,
                "is_superuser": False,
            },
            {
                "username": "uploader1",
                "email": "uploader1@example.com",
                "first_name": "Data",
                "last_name": "Uploader",
                "role": User.Role.UPLOADER,
                "is_staff": False,
                "is_superuser": False,
            },
        ]

        created_or_updated = []

        for item in users:
            user, created = User.objects.get_or_create(
                username=item["username"],
                defaults={
                    "email": item["email"],
                    "first_name": item["first_name"],
                    "last_name": item["last_name"],
                    "role": item["role"],
                    "is_staff": item["is_staff"],
                    "is_superuser": item["is_superuser"],
                    "is_active": True,
                },
            )

            changed = False
            for field in ["email", "first_name", "last_name", "role", "is_staff", "is_superuser"]:
                value = item[field]
                if getattr(user, field) != value:
                    setattr(user, field, value)
                    changed = True

            if not user.is_active:
                user.is_active = True
                changed = True

            user.set_password(password)
            changed = True

            if changed:
                user.save()

            created_or_updated.append((user, created))

        self.stdout.write(self.style.SUCCESS("Demo users ready:"))
        for user, created in created_or_updated:
            status = "created" if created else "updated"
            self.stdout.write(f"- {user.username} ({user.role}) [{status}]")

        self.stdout.write(
            self.style.WARNING(
                f"All demo user passwords are set to: {password}\n"
                "Change them immediately in non-local environments."
            )
        )
