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

from apps.access.models import MembershipRole, Role
from apps.access.services import seed_roles
from apps.audit import services as audit
from apps.modules import services as modules
from apps.organizations.models import Organization, OrganizationMembership


class Command(BaseCommand):
    help = (
        "Idempotent. Syncs the module/permission registry, creates the NoTeam platform organization "
        "and a default customer organization, and moves every existing account into the default "
        "organization (is_admin -> org_manager, others -> employee). Safe to run repeatedly."
    )

    def add_arguments(self, parser):
        parser.add_argument("--default-org-name", default="مجموعه پیش‌فرض")
        parser.add_argument("--default-org-slug", default="default")

    @transaction.atomic
    def handle(self, *args, **opts):
        counts = modules.sync_registry()

        platform, _ = Organization.objects.get_or_create(
            kind=Organization.Kind.PLATFORM, defaults={"name": "NoTeam", "slug": "noteam"}
        )
        seed_roles(platform)

        default_org, created = Organization.objects.get_or_create(
            slug=opts["default_org_slug"],
            defaults={"name": opts["default_org_name"], "kind": Organization.Kind.CUSTOMER},
        )
        seed_roles(default_org)
        modules.enable_module(actor=None, organization=default_org, module_code="attendance")
        if created:
            audit.record(
                actor=None, action="organization.created", organization=default_org,
                entity_type="organization", entity_id=default_org.pk, after={"source": "bootstrap_core"},
            )

        manager = Role.objects.get(organization=default_org, code="org_manager")
        employee = Role.objects.get(organization=default_org, code="employee")
        User = get_user_model()
        moved = 0
        for user in User.objects.order_by("id"):
            membership, was_created = OrganizationMembership.objects.get_or_create(
                user=user, organization=default_org, defaults={"personnel_code": user.personnel_code}
            )
            if was_created:
                MembershipRole.objects.get_or_create(
                    membership=membership, role=manager if user.is_admin else employee
                )
                moved += 1

        self.stdout.write(
            self.style.SUCCESS(
                f"modules/permissions synced (+{counts['modules_created']} modules, "
                f"+{counts['permissions_created']} permissions); platform org '{platform.slug}'; "
                f"default org '{default_org.slug}'; {moved} account(s) added to it."
            )
        )
