"""Management command to create an administrator account.

Usage:
    python manage.py create_admin --code 1001 --password secret --name "Admin" [--org default]

The account is also made `org_manager` of the given organization (run `bootstrap_core` first so it
exists). Platform-wide power is never granted here: use `bootstrap_platform` for that, explicitly.
"""
from django.core.management.base import BaseCommand, CommandError

from apps.access.models import MembershipRole, Role
from apps.organizations.models import Organization, OrganizationMembership
from infrastructure.models import User


class Command(BaseCommand):
    help = "Create an administrator account and make it org_manager of an organization."

    def add_arguments(self, parser):
        parser.add_argument("--code", required=True, help="login id (also used as the username)")
        parser.add_argument("--password", required=True)
        parser.add_argument("--name", required=False, default="")
        parser.add_argument("--org", required=False, default="default", help="organization slug (default: default)")

    def handle(self, *args, **options):
        code = options["code"]
        if User.objects.filter(personnel_code=code).exists() or User.objects.filter(username__iexact=code).exists():
            raise CommandError(f"An account with login '{code}' already exists.")

        organization = Organization.objects.filter(slug=options["org"]).first()
        manager_role = (
            Role.objects.filter(organization=organization, code="org_manager").first() if organization else None
        )
        if manager_role is None:
            raise CommandError(
                f"Organization '{options['org']}' or its roles not found. Run `manage.py bootstrap_core` first."
            )

        user = User.objects.create_superuser(
            personnel_code=code, password=options["password"], name=options["name"] or None
        )
        membership = OrganizationMembership.objects.create(
            user=user, organization=organization, personnel_code=code
        )
        MembershipRole.objects.create(membership=membership, role=manager_role)
        self.stdout.write(
            self.style.SUCCESS(f"Admin created: {user.personnel_code} (id={user.id}), org_manager of '{organization.slug}'.")
        )
