"""
Management command to seed mock data in the database.

Creates mock GitHub installations and LinkedIn pages for testing.

Usage:
    # Seed default mock data
    python manage.py seed_mock_data

    # Seed specific number of installations
    python manage.py seed_mock_data --installations 5

    # Seed LinkedIn pages as well
    python manage.py seed_mock_data --linkedin

    # Clear existing mock data first
    python manage.py seed_mock_data --clear
"""

from __future__ import annotations

from django.core.management.base import BaseCommand, CommandError
from django.db import transaction
from faker import Faker

fake = Faker()


class Command(BaseCommand):
    help = "Seed the database with mock GitHub installations and LinkedIn pages for testing"

    def add_arguments(self, parser):
        parser.add_argument(
            "--installations",
            type=int,
            default=2,
            help="Number of GitHub installations to create (default: 2)",
        )
        parser.add_argument(
            "--repos-per-installation",
            type=int,
            default=3,
            help="Number of repositories per installation (default: 3)",
        )
        parser.add_argument(
            "--linkedin",
            action="store_true",
            help="Also seed LinkedIn pages",
        )
        parser.add_argument(
            "--linkedin-pages",
            type=int,
            default=1,
            help="Number of LinkedIn pages to create (default: 1)",
        )
        parser.add_argument(
            "--clear",
            action="store_true",
            help="Clear existing mock data before seeding",
        )
        parser.add_argument(
            "--workspace-id",
            type=str,
            help="Specific workspace ID to seed data for (creates workspace if needed)",
        )

    @transaction.atomic
    def handle(self, *args, **options):
        num_installations = options["installations"]
        repos_per_installation = options["repos_per_installation"]
        seed_linkedin = options["linkedin"]
        num_linkedin_pages = options["linkedin_pages"]
        clear_first = options["clear"]
        workspace_id = options.get("workspace_id")

        # Import models
        try:
            from accounts.models import Workspace
            from integrations.models import GitHubInstallation, GitHubRepository
        except ImportError as e:
            raise CommandError(f"Failed to import required models: {e}") from e

        # Clear existing data if requested
        if clear_first:
            self.stdout.write("Clearing existing mock data...")
            # Only clear mock data (installations with mock- prefix)
            mock_installations = GitHubInstallation.objects.filter(account_login__startswith="mock-")
            count = mock_installations.count()
            mock_installations.delete()
            self.stdout.write(f"  Deleted {count} mock installations")

        # Get or create workspace
        if workspace_id:
            workspace, created = Workspace.objects.get_or_create(
                id=workspace_id,
                defaults={"name": f"Mock Workspace {workspace_id[:8]}"},
            )
            if created:
                self.stdout.write(f"Created workspace: {workspace.name}")
        else:
            # Get or create a default mock workspace
            workspace, created = Workspace.objects.get_or_create(
                name="Mock Development Workspace",
                defaults={"slug": "mock-dev"},
            )
            if created:
                self.stdout.write(f"Created workspace: {workspace.name}")

        # Seed GitHub installations
        self.stdout.write(f"\nSeeding {num_installations} GitHub installations...")
        installations_created = 0

        for i in range(num_installations):
            account_login = f"mock-org-{i + 1}"
            installation_id = 10000 + i

            # Check if installation already exists
            if GitHubInstallation.objects.filter(installation_id=installation_id).exists():
                self.stdout.write(f"  Skipping existing installation: {account_login}")
                continue

            # For workspace, we need to handle the one-to-one constraint
            # Create additional workspaces for additional installations
            if i > 0:
                inst_workspace, _ = Workspace.objects.get_or_create(
                    name=f"Mock Workspace {i + 1}",
                    defaults={"slug": f"mock-workspace-{i + 1}"},
                )
            else:
                inst_workspace = workspace

            # Check if workspace already has an installation
            if hasattr(inst_workspace, "github_installation"):
                self.stdout.write(f"  Skipping: Workspace {inst_workspace.name} already has an installation")
                continue

            installation = GitHubInstallation.objects.create(
                workspace=inst_workspace,
                installation_id=installation_id,
                account_login=account_login,
                account_type="Organization",
                account_id=50000 + i,
                permissions={
                    "issues": "write",
                    "pull_requests": "write",
                    "contents": "read",
                    "metadata": "read",
                    "discussions": "write",
                },
            )

            self.stdout.write(f"  Created installation: {account_login} (ID: {installation_id})")
            installations_created += 1

            # Create repositories for this installation
            for j in range(repos_per_installation):
                repo_id = installation_id * 100 + j
                repo_name = f"repo-{j + 1}"
                full_name = f"{account_login}/{repo_name}"

                GitHubRepository.objects.create(
                    installation=installation,
                    repo_id=repo_id,
                    owner=account_login,
                    name=repo_name,
                    full_name=full_name,
                    sync_status="active",
                )
                self.stdout.write(f"    Created repository: {full_name}")

        # Seed LinkedIn pages if requested
        if seed_linkedin:
            try:
                from integrations.models import LinkedInPage
            except ImportError:
                self.stdout.write(self.style.WARNING("\n  LinkedIn model not available, skipping LinkedIn seeding"))
            else:
                self.stdout.write(f"\nSeeding {num_linkedin_pages} LinkedIn pages...")
                for i in range(num_linkedin_pages):
                    org_id = f"1234567{i}"
                    page_name = f"Mock Company {i + 1}"

                    # Check if page already exists
                    if LinkedInPage.objects.filter(organization_id=org_id).exists():
                        self.stdout.write(f"  Skipping existing page: {page_name}")
                        continue

                    # Get workspace for this page
                    if i > 0:
                        page_workspace, _ = Workspace.objects.get_or_create(
                            name=f"Mock LinkedIn Workspace {i + 1}",
                            defaults={"slug": f"mock-linkedin-{i + 1}"},
                        )
                    else:
                        page_workspace = workspace

                    LinkedInPage.objects.create(
                        workspace=page_workspace,
                        organization_id=org_id,
                        organization_urn=f"urn:li:organization:{org_id}",
                        name=page_name,
                        vanity_name=f"mock-company-{i + 1}",
                    )
                    self.stdout.write(f"  Created LinkedIn page: {page_name}")

        # Summary
        self.stdout.write(self.style.SUCCESS("\nSeeding complete!"))
        self.stdout.write(f"  GitHub installations created: {installations_created}")
        self.stdout.write(f"  Total repositories: {installations_created * repos_per_installation}")
