"""
Management command pour générer des données de test :
- 3 formations : Leadership, Prise de parole, PPP (Partenariat Public-Privé)
- 100+ réponses pour l'Étude de Marché
- Un Business Plan, un BMC, un Pitch Deck

Usage: python manage.py seed_test_data
"""
import random
from decimal import Decimal
from datetime import date, timedelta

from django.core.management.base import BaseCommand
from django.contrib.auth import get_user_model
from django.utils import timezone

from formations.models import Formation, Lesson, UserFormationStatus
from market.models import MarketSurvey, SurveyResponse
from business_plan.models import BusinessPlan, Investment, HumanResource, StartupCost, RevenueForecast, ExpenseForecast
from tools.models import BusinessModelCanvas, PitchDeck

User = get_user_model()

# Constantes pour l'étude de marché
AGE_CHOICES = [c[0] for c in SurveyResponse.AGE_CHOICES]
GENDER_CHOICES = [c[0] for c in SurveyResponse.GENDER_CHOICES]
FREQUENCY_CHOICES = [c[0] for c in SurveyResponse.FREQUENCY_CHOICES]
PRICE_CHOICES = [c[0] for c in SurveyResponse.PRICE_PERCEPTION_CHOICES]
RATING_CHOICES = [1, 2, 3, 4, 5]
SERVICE_CHOICES = [c[0] for c in SurveyResponse.SERVICE_RATING_CHOICES]
LOCATIONS = ['Dakar', 'Thiès', 'Saint-Louis', 'Ziguinchor', 'Mbour', 'Kaolack', 'Tambacounda', 'Louga', 'Diourbel', 'Kolda', 'Sédhiou', 'Matam', 'Kaffrine', 'Fatick', 'Kédougou']

FORMATIONS_DATA = [
    {
        'title': 'Leadership',
        'description': 'Développez vos capacités de leadership pour inspirer et guider votre équipe vers la réussite.',
        'order': 1,
        'lessons': [
            'Introduction au Leadership',
            'Les styles de leadership',
            'Motivation et engagement',
            'Délégation et responsabilisation',
            'Communication efficace en leadership',
        ],
    },
    {
        'title': 'Prise de parole',
        'description': 'Maîtrisez l\'art de la prise de parole en public pour captiver votre audience et convaincre.',
        'order': 2,
        'lessons': [
            'Les fondamentaux de la prise de parole',
            'Gestion du stress et de la confiance',
            'Structurer un discours percutant',
            'Langage corporel et voix',
            'Interagir avec l\'audience',
        ],
    },
    {
        'title': 'PPP - Partenariat Public-Privé',
        'description': 'Comprendre les PPP pour monter des projets en collaboration avec le secteur public.',
        'order': 3,
        'lessons': [
            'Introduction aux PPP',
            'Cadre juridique et réglementaire',
            'Processus de montage d\'un PPP',
            'Financement et risque',
            'Exemples de PPP au Sénégal',
        ],
    },
]


class Command(BaseCommand):
    help = 'Génère des données de test : 3 formations, 100+ réponses marché, BP, BMC, Pitch'

    def add_arguments(self, parser):
        parser.add_argument(
            '--email',
            type=str,
            default='test@goon.academy',
            help='Email de l\'utilisateur de test (créé ou utilisé)',
        )
        parser.add_argument(
            '--responses',
            type=int,
            default=105,
            help='Nombre de réponses à générer pour l\'étude de marché (défaut: 105)',
        )

    def handle(self, *args, **options):
        email = options['email']
        num_responses = options['responses']

        self.stdout.write('Création des données de test...')

        # 1. Utilisateur de test
        user, created = User.objects.get_or_create(
            email=email,
            defaults={
                'first_name': 'Test',
                'last_name': 'Entrepreneur',
                'phone': '+221 77 123 45 67',
                'is_active': True,
                'is_verified': True,
            },
        )
        if created:
            user.set_password('Test123!')
            user.save()
            self.stdout.write(self.style.SUCCESS(f'Utilisateur créé : {email}'))
        else:
            self.stdout.write(f'Utilisateur existant : {email}')

        # 2. Formations
        for data in FORMATIONS_DATA:
            formation, _ = Formation.objects.get_or_create(
                title=data['title'],
                defaults={
                    'description': data['description'],
                    'order': data['order'],
                },
            )
            for idx, title in enumerate(data['lessons'], start=1):
                Lesson.objects.get_or_create(
                    formation=formation,
                    order=idx,
                    defaults={
                        'title': title,
                        'lesson_type': 'PDF',
                    },
                )
            self.stdout.write(f'Formation : {formation.title} ({len(data["lessons"])} leçons)')

        # 3. Marquer toutes les formations comme validées pour l'utilisateur test
        for formation in Formation.objects.all():
            UserFormationStatus.objects.get_or_create(
                user=user,
                formation=formation,
                defaults={
                    'is_completed': True,
                    'final_score': 12,
                    'completed_at': timezone.now(),
                },
            )
        self.stdout.write('Formations validées pour l\'utilisateur test.')

        # 4. Étude de marché : 100+ réponses
        study, _ = MarketSurvey.objects.get_or_create(entrepreneur=user)
        existing = study.responses.count()
        to_create = max(0, num_responses - existing)
        if to_create > 0:
            for i in range(to_create):
                SurveyResponse.objects.create(
                    study=study,
                    respondent_name=f'Personne {existing + i + 1}' if random.random() > 0.3 else None,
                    age_range=random.choice(AGE_CHOICES),
                    gender=random.choice(GENDER_CHOICES),
                    location=random.choice(LOCATIONS),
                    purchase_frequency=random.choice(FREQUENCY_CHOICES),
                    preferred_channels='Magasin physique, En ligne' if random.random() > 0.5 else 'Boutique locale',
                    decision_factors='Prix, Qualité, Recommandation',
                    desired_features='Facilité d\'utilisation, Prix compétitif',
                    pain_points='Manque d\'options locales',
                    interest_level=random.choice(RATING_CHOICES),
                    current_competitors='Concurrent A, Concurrent B',
                    competitor_feedback='Bon rapport qualité-prix',
                    general_price_perception=random.choice(PRICE_CHOICES),
                    interested_in_future=random.random() > 0.3,
                )
            self.stdout.write(self.style.SUCCESS(f'{to_create} réponses créées. Total : {study.responses.count()}'))
        else:
            self.stdout.write(f'Étude de marché : {study.responses.count()} réponses (déjà suffisant)')

        if study.responses.count() >= 100:
            study.is_validated = True
            study.save()

        # 5. Business Plan
        bp, bp_created = BusinessPlan.objects.get_or_create(
            entrepreneur=user,
            defaults={
                'company_name': 'TechGo Sénégal',
                'legal_status': 'SARL',
                'creation_date': date.today() - timedelta(days=180),
                'receipt_number': 'REC-2024-001',
                'rc_number': 'RC-DKR-2024-1234',
                'ninea': '123456789',
                'address': 'Plateau, Dakar',
                'contact_name': 'Test Entrepreneur',
                'contact_phone': '+221 77 123 45 67',
                'contact_email': email,
                'experience_text': '5 ans dans le secteur tech au Sénégal.',
                'training_text': 'Ingénieur en informatique.',
                'skills_text': 'Développement web, gestion de projet.',
                'project_object': 'Développer une plateforme de formation en ligne adaptée au marché sénégalais.',
                'project_objectives': 'Former 1000 entrepreneurs en 2 ans.',
                'location_reason': 'Dakar concentre les talents et les investisseurs.',
                'product_description': 'Formations en ligne sur l\'entrepreneuriat.',
                'competition_analysis': 'Peu de plateformes locales adaptées.',
                'customer_analysis': 'Jeunes entrepreneurs, PME.',
                'marketing_strategy': 'Digital first, partenariats avec incubateurs.',
                'process_description': 'Création de contenus, hébergement cloud.',
                'personal_contribution': Decimal('2000000'),
                'other_funding': Decimal('5000000'),
                'loan_interest_rate': Decimal('8.5'),
                'loan_duration_months': 36,
                'loan_deferral_months': 6,
                'loan_repayment_periodicity': 'MENSUEL',
            },
        )
        if bp_created:
            Investment.objects.create(
                plan=bp,
                name='Serveurs et hébergement',
                invest_type='INCORPOREL',
                quantity=1,
                unit_price=Decimal('500000'),
                duration_years=3,
            )
            HumanResource.objects.create(
                plan=bp,
                position='Développeur Full Stack',
                count=1,
                monthly_salary=Decimal('350000'),
                description='Développement et maintenance plateforme',
            )
            StartupCost.objects.create(
                plan=bp,
                category='LABOR',
                designation='Salaire premier trimestre',
                monthly_amount=Decimal('350000'),
                months_needed=3,
            )
            RevenueForecast.objects.create(
                plan=bp,
                product_name='Abonnements formation',
                year_1=Decimal('5000000'),
                year_2=Decimal('12000000'),
                year_3=Decimal('20000000'),
                year_4=Decimal('30000000'),
            )
            ExpenseForecast.objects.create(
                plan=bp,
                designation='Salaires et charges',
                year_1=Decimal('4000000'),
                year_2=Decimal('8000000'),
                year_3=Decimal('12000000'),
                year_4=Decimal('15000000'),
            )
            self.stdout.write(self.style.SUCCESS('Business Plan créé.'))
        else:
            self.stdout.write('Business Plan existant.')

        # 6. BMC
        bmc, bmc_created = BusinessModelCanvas.objects.get_or_create(
            entrepreneur=user,
            defaults={
                'key_partners': 'Incubateurs, banques, partenaires techniques.',
                'key_activities': 'Création de contenus, développement plateforme.',
                'key_resources': 'Équipe pédagogique, serveurs, contenu propriétaire.',
                'value_proposition': 'Formations entrepreneuriales adaptées au contexte sénégalais.',
                'customer_relationships': 'Support client, communauté en ligne.',
                'channels': 'Site web, réseaux sociaux, partenariats.',
                'customer_segments': 'Jeunes entrepreneurs, PME, porteurs de projets.',
                'cost_structure': 'Salaires, hébergement, marketing.',
                'revenue_streams': 'Abonnements, formations sur mesure.',
            },
        )
        if bmc_created:
            self.stdout.write(self.style.SUCCESS('BMC créé.'))
        else:
            self.stdout.write('BMC existant.')

        # 7. Pitch Deck
        pitch, pitch_created = PitchDeck.objects.get_or_create(
            entrepreneur=user,
            defaults={
                'project_name': 'Goon Academy',
                'tagline': 'Formez-vous pour entreprendre au Sénégal.',
                'problem': 'Manque de formations entrepreneuriales adaptées au contexte local.',
                'solution': 'Plateforme de formation en ligne avec accompagnement personnalisé.',
                'market_potential': '50 000 entrepreneurs potentiels au Sénégal.',
                'business_model': 'Abonnements mensuels et formations sur mesure.',
                'achievements_text': '100+ apprenants, 3 formations lancées.',
                'roadmap': 'Lancement national, expansion Afrique de l\'Ouest.',
                'needs': '500 000 000 FCFA pour scaling.',
                'vision_5_years': 'Devenir la référence de la formation entrepreneuriale en Afrique.',
                'final_pitch': 'Rejoignez-nous pour transformer l\'entrepreneuriat sénégalais.',
            },
        )
        if pitch_created:
            self.stdout.write(self.style.SUCCESS('Pitch Deck créé.'))
        else:
            self.stdout.write('Pitch Deck existant.')

        self.stdout.write(self.style.SUCCESS('\nDonnées de test générées avec succès.'))
        self.stdout.write(f'Connectez-vous avec : {email} / Test123!')
