from django.contrib.auth.models import Group, User
from django.core.management.base import BaseCommand
from organization.models import Membership, Organization, OrganizationGroup


DEFAULT_GROUPS = [
    "Teacher",
]

DEFAULT_USERS = [
    {
        "username": "nazmul.sir",
        "first_name": "Nazmul",
        "last_name": "Sir",
        "email": "nazmul@demouniversity.edu",
        "password": "nazmul1234",
        "org_code": "DEMO-UNI",
        "group_name": "Teacher",
    },
]

DEFAULT_ORGANIZATIONS = [
    {
        "name": "Demo University",
        "code": "DEMO-UNI",
        "email": "admin@demouniversity.edu",
        "phone": "+1-000-000-0001",
        "external_id": "ext-demo-university",
        "description": "Default demo university for testing.",
        "city": "Dhaka",
        "country": "Bangladesh",
    },
    {
        "name": "City College",
        "code": "CITY-COL",
        "email": "admin@citycollege.edu",
        "phone": "+1-000-000-0002",
        "external_id": "ext-city-college",
        "description": "Default city college for testing.",
        "city": "Chittagong",
        "country": "Bangladesh",
    },
]


class Command(BaseCommand):
    help = "Seed default organizations"

    def add_arguments(self, parser):
        parser.add_argument(
            "--clear",
            action="store_true",
            help="Delete all existing organizations before seeding",
        )

    def handle(self, *args, **options):
        if options["clear"]:
            count, _ = Organization.objects.all().delete()
            self.stdout.write(self.style.WARNING(f"Deleted {count} existing organizations."))

        created, skipped = 0, 0

        for data in DEFAULT_ORGANIZATIONS:
            obj, is_created = Organization.objects.get_or_create(
                external_id=data["external_id"],
                defaults=data,
            )
            if is_created:
                created += 1
                self.stdout.write(self.style.SUCCESS(f"  Created: {obj}"))
            else:
                skipped += 1
                self.stdout.write(f"  Skipped (already exists): {obj}")

        self.stdout.write(
            self.style.SUCCESS(f"\nDone. Created: {created}, Skipped: {skipped}")
        )

        self._seed_groups()
        self._seed_users()

    def _seed_groups(self):
        self.stdout.write("\nSeeding groups...")
        for name in DEFAULT_GROUPS:
            group, created = Group.objects.get_or_create(name=name)
            if created:
                self.stdout.write(self.style.SUCCESS(f"  Created group: {name}"))
            else:
                self.stdout.write(f"  Skipped group (exists): {name}")

    def _seed_users(self):
        self.stdout.write("\nSeeding users...")
        for data in DEFAULT_USERS:
            user, created = User.objects.get_or_create(
                username=data["username"],
                defaults={
                    "first_name": data["first_name"],
                    "last_name": data["last_name"],
                    "email": data["email"],
                },
            )
            if created:
                user.set_password(data["password"])
                user.save()
                self.stdout.write(self.style.SUCCESS(f"  Created user: {user.username}"))
            else:
                self.stdout.write(f"  Skipped user (exists): {user.username}")

            try:
                org = Organization.objects.get(code=data["org_code"])
                group = Group.objects.get(name=data["group_name"])
                membership, m_created = Membership.objects.get_or_create(
                    user=user, organization=org, group=group
                )
                if m_created:
                    self.stdout.write(self.style.SUCCESS(
                        f"  Assigned {user.username} -> {group.name} @ {org.code}"
                    ))
                else:
                    self.stdout.write(
                        f"  Skipped membership (exists): {user.username} @ {org.code}"
                    )
            except Organization.DoesNotExist:
                self.stdout.write(self.style.WARNING(
                    f"  Org '{data['org_code']}' not found — run seeder after org is created."
                ))
            except Group.DoesNotExist:
                self.stdout.write(self.style.WARNING(
                    f"  Group '{data['group_name']}' not found."
                ))
