"""
Management command to populate test data for the CelebrityFan platform.
Includes test users, profiles, media, follows, likes, and booking requests.
"""

from django.core.management.base import BaseCommand
from django.utils import timezone
from django.contrib.auth import get_user_model
from django.core.files.base import ContentFile
from datetime import timedelta
from PIL import Image
import io

from users.models import Profile
from core.models import (
    SubscriptionPlan,
    UserSubscription,
    CreatorMedia,
    ProfileFollow,
    MediaLike,
    BookingRequest,
    PaymentTransaction,
    Notification,
)

User = get_user_model()


def create_test_image(name="test.jpg", size=(200, 200), color="red"):
    """Create a simple PIL image for testing."""
    img = Image.new("RGB", size, color=color)
    file = io.BytesIO()
    img.save(file, format="JPEG")
    file.seek(0)
    return file, f"{name}.jpg"


class Command(BaseCommand):
    help = "Populate the database with test data for development and testing"

    def add_arguments(self, parser):
        parser.add_argument(
            "--clear",
            action="store_true",
            help="Clear existing data before populating",
        )

    def handle(self, *args, **options):
        if options["clear"]:
            self.stdout.write("Clearing existing data...")
            User.objects.exclude(is_superuser=True).delete()

        self.stdout.write("Creating subscription plans...")
        self._create_subscription_plans()

        self.stdout.write("Creating celebrity users and profiles...")
        celebrities = self._create_celebrities()

        self.stdout.write("Creating fan users...")
        fans = self._create_fans()

        self.stdout.write("Creating media for celebrities...")
        self._create_media_for_celebrities(celebrities)

        self.stdout.write("Creating follows...")
        self._create_follows(fans, celebrities)

        self.stdout.write("Creating media likes...")
        self._create_likes(fans, celebrities)

        self.stdout.write("Creating booking requests...")
        self._create_bookings(fans, celebrities)

        self.stdout.write("Creating user subscriptions...")
        self._create_user_subscriptions(fans)

        self.stdout.write(self.style.SUCCESS("✓ Test data population complete!"))

    def _create_subscription_plans(self):
        """Create subscription plans."""
        plans = [
            {
                "name": "Basic Fan",
                "description": "Access to basic fan features",
                "price_cents": 999,
                "duration_days": 30,
                "max_active_threads": 10,
                "max_message_credits": 500,
            },
            {
                "name": "Premium Fan",
                "description": "Premium access with priority support",
                "price_cents": 2999,
                "duration_days": 30,
                "max_active_threads": 20,
                "max_message_credits": 1000,
            },
            {
                "name": "VIP Fan",
                "description": "Exclusive access and direct messaging",
                "price_cents": 4999,
                "duration_days": 30,
                "max_active_threads": 50,
                "max_message_credits": 5000,
            },
        ]
        for plan_data in plans:
            SubscriptionPlan.objects.get_or_create(
                name=plan_data["name"], defaults=plan_data
            )

    def _create_celebrities(self):
        """Create celebrity users and profiles."""
        celebrity_data = [
            {
                "username": "sophia_luxury",
                "email": "sophia@celebrities.com",
                "first_name": "Sophia",
                "last_name": "Luxury",
                "display_name": "Sophia Luxury",
                "headline": "Fashion Icon & Beauty Creator",
                "bio": "Luxury lifestyle, fashion tips, and beauty tutorials.",
                "gender": "female",
                "city": "Los Angeles",
                "country": "USA",
                "visibility": "public",
                "is_verified": True,
            },
            {
                "username": "marco_elite",
                "email": "marco@celebrities.com",
                "first_name": "Marco",
                "last_name": "Elite",
                "display_name": "Marco Elite",
                "headline": "Fitness & Wellness Expert",
                "bio": "Fitness coaching, wellness tips, and lifestyle inspiration.",
                "gender": "male",
                "city": "Miami",
                "country": "USA",
                "visibility": "public",
                "is_verified": True,
            },
            {
                "username": "aria_dreams",
                "email": "aria@celebrities.com",
                "first_name": "Aria",
                "last_name": "Dreams",
                "display_name": "Aria Dreams",
                "headline": "Music & Entertainment",
                "bio": "Singer, songwriter, and entertainment creator.",
                "gender": "female",
                "city": "Nashville",
                "country": "USA",
                "visibility": "public",
                "is_verified": True,
            },
            {
                "username": "blake_wanderer",
                "email": "blake@celebrities.com",
                "first_name": "Blake",
                "last_name": "Wanderer",
                "display_name": "Blake Wanderer",
                "headline": "Travel & Adventure",
                "bio": "Travel blogger exploring the world.",
                "gender": "male",
                "city": "New York",
                "country": "USA",
                "visibility": "public",
                "is_verified": True,
            },
            {
                "username": "nina_creative",
                "email": "nina@celebrities.com",
                "first_name": "Nina",
                "last_name": "Creative",
                "display_name": "Nina Creative",
                "headline": "Art & Design Creator",
                "bio": "Digital art, graphic design, and creative inspiration.",
                "gender": "female",
                "city": "San Francisco",
                "country": "USA",
                "visibility": "public",
                "is_verified": True,
            },
        ]

        celebrities = []
        for data in celebrity_data:
            user, created = User.objects.get_or_create(
                username=data["username"],
                defaults={
                    "email": data["email"],
                    "first_name": data["first_name"],
                    "last_name": data["last_name"],
                    "is_celebrity": True,
                    "is_verified": data["is_verified"],
                    "is_active": True,
                },
            )
            if created:
                user.set_password("testpass123")
                user.save()

            # Create or update profile
            profile, _ = Profile.objects.get_or_create(
                user=user,
                defaults={
                    "display_name": data["display_name"],
                    "headline": data["headline"],
                    "bio": data["bio"],
                    "gender": data["gender"],
                    "city": data["city"],
                    "country": data["country"],
                    "visibility": data["visibility"],
                    "can_receive_messages": True,
                    "interests": ["entertainment", "lifestyle"],
                },
            )
            celebrities.append(user)

        return celebrities

    def _create_fans(self):
        """Create regular fan users."""
        fan_usernames = [
            "alice_fan", "bob_enthusiast", "carol_lover", "david_admirer",
            "emma_fan", "frank_follower", "grace_admirer", "henry_fan"
        ]

        fans = []
        for i, username in enumerate(fan_usernames):
            user, created = User.objects.get_or_create(
                username=username,
                defaults={
                    "email": f"{username}@example.com",
                    "first_name": username.split("_")[0].title(),
                    "is_active": True,
                },
            )
            if created:
                user.set_password("testpass123")
                user.save()

            # Create profile
            Profile.objects.get_or_create(
                user=user,
                defaults={
                    "display_name": username.replace("_", " ").title(),
                    "bio": f"Fan of great creators and exclusive content.",
                    "city": ["Los Angeles", "New York", "Miami", "Chicago"][i % 4],
                    "country": "USA",
                    "visibility": "discoverable",
                    "can_receive_messages": True,
                },
            )
            fans.append(user)

        return fans

    def _create_media_for_celebrities(self, celebrities):
        """Create media items for celebrities."""
        media_configs = [
            {
                "category": CreatorMedia.Category.BEAUTIFUL_GAILS,
                "titles": ["Glam Look", "Fashion Forward", "Style Inspiration"],
                "colors": ["#FF69B4", "#FFB6C1", "#FFC0CB"],
            },
            {
                "category": CreatorMedia.Category.HANDSOME_BOYS,
                "titles": ["Sharp Fit", "Casual Cool", "Elite Style"],
                "colors": ["#1E90FF", "#4169E1", "#87CEEB"],
            },
            {
                "category": CreatorMedia.Category.PREMIUM_CREW,
                "titles": ["Premium Collection", "Exclusive Access", "VIP Preview"],
                "colors": ["#FFD700", "#FFA500", "#FF8C00"],
            },
            {
                "category": CreatorMedia.Category.FEATURED_COLLECTION,
                "titles": ["Featured Work", "Showcase", "Portfolio"],
                "colors": ["#32CD32", "#00FF00", "#7FFF00"],
            },
        ]

        for celebrity in celebrities:
            profile = celebrity.profile
            for config in media_configs:
                for title in config["titles"]:
                    # Create image file
                    img_file, img_name = create_test_image(
                        name=f"{celebrity.username}_{title}",
                        size=(400, 400),
                        color=config["colors"][config["titles"].index(title)],
                    )

                    CreatorMedia.objects.create(
                        creator=profile,
                        title=title,
                        description=f"Exclusive {title.lower()} from {celebrity.username}",
                        category=config["category"],
                        media_type=CreatorMedia.MediaType.IMAGE,
                        media_file=ContentFile(
                            img_file.read(), name=img_name
                        ),
                        is_active=True,
                    )

    def _create_follows(self, fans, celebrities):
        """Create follow relationships between fans and celebrities."""
        import random

        for fan in fans:
            # Each fan follows 2-3 random celebrities
            num_follows = random.randint(2, 3)
            for celebrity in random.sample(celebrities, num_follows):
                ProfileFollow.objects.get_or_create(
                    follower=fan, profile=celebrity.profile
                )

    def _create_likes(self, fans, celebrities):
        """Create likes on media items."""
        import random

        for celebrity in celebrities:
            media_items = celebrity.profile.media_items.filter(is_active=True)
            for media in media_items:
                # Each media gets liked by 2-5 random fans
                num_likes = random.randint(2, 5)
                for fan in random.sample(fans, min(num_likes, len(fans))):
                    MediaLike.objects.get_or_create(user=fan, media_item=media)

    def _create_bookings(self, fans, celebrities):
        """Create booking requests."""
        import random

        for fan in fans[:4]:  # Only a few fans make bookings
            # Each fan books 1-2 celebrities
            num_bookings = random.randint(1, 2)
            for celebrity in random.sample(celebrities, num_bookings):
                preferred_date = timezone.now() + timedelta(
                    days=random.randint(7, 60)
                )
                BookingRequest.objects.create(
                    requester=fan,
                    profile=celebrity.profile,
                    preferred_date=preferred_date.date(),
                    message=f"Hi {celebrity.username}, would love to book a meeting with you!",
                    status=random.choice(
                        ["pending", "confirmed", "declined"]
                    ),
                )

    def _create_user_subscriptions(self, fans):
        """Create active subscriptions for fans."""
        import random

        plans = SubscriptionPlan.objects.all()
        for fan in fans:
            # 70% of fans have a subscription
            if random.random() < 0.7:
                plan = random.choice(plans)
                expires_at = timezone.now() + timedelta(days=random.randint(10, 120))
                UserSubscription.objects.create(
                    user=fan,
                    plan=plan,
                    started_at=timezone.now(),
                    expires_at=expires_at,
                    is_active=True,
                    auto_renew=random.choice([True, False]),
                    payment_provider=random.choice(
                        ["stripe", "paystack", "flutterwave"]
                    ),
                )
