"""One-off seeder: creates a login user per existing Role, all under the
caridu.id organization, for manual role-based testing.

Idempotent — re-running skips users/memberships/assignments that already exist.
"""

import re

from django.core.management.base import BaseCommand, CommandError

from apps.companies.models import Organization, OrganizationMembership
from apps.core.models import Role, User, UserRole
from apps.hr.signals import ensure_employee_stub

PASSWORD = "687654"
DOMAIN = "caridu.id"


def slugify_email(role_name: str) -> str:
    slug = re.sub(r"[^a-z0-9]+", "", role_name.lower())
    return f"{slug}@{DOMAIN}"


class Command(BaseCommand):
    help = "Create one caridu.id user per Role for manual testing."

    def handle(self, *args, **options):
        try:
            org = Organization.objects.get(name=DOMAIN)
        except Organization.DoesNotExist as e:
            raise CommandError(f"Organization '{DOMAIN}' not found") from e

        created_users = 0
        for role in Role.objects.all():
            email = slugify_email(role.name)
            user, made = User.objects.get_or_create(
                email=email,
                defaults={
                    "first_name": role.name,
                    "must_change_password": False,
                },
            )
            if made:
                user.set_password(PASSWORD)
                user.save(update_fields=["password"])
                created_users += 1

            OrganizationMembership.objects.get_or_create(organization=org, user=user)
            ensure_employee_stub(user)
            UserRole.objects.get_or_create(user=user, role=role, organization=org)

            self.stdout.write(f"{'created' if made else 'exists '}  {email}  ({role.name})")

        self.stdout.write(self.style.SUCCESS(f"Done. {created_users} new users created."))
