"""
Commande pour creer les pages CMS, sections et associations.

Usage:
    python manage.py setup_cms_pages
    python manage.py setup_cms_pages --force  # Recreer meme si existant
"""

from django.core.management.base import BaseCommand
from cms.models import Template, TemplateFile, Section, Page, PageSection


class Command(BaseCommand):
    help = 'Cree les pages CMS, sections et associations PageSection'

    def add_arguments(self, parser):
        parser.add_argument(
            '--force',
            action='store_true',
            help='Recreer les elements meme si ils existent deja',
        )

    def handle(self, *args, **options):
        force = options['force']

        # Recuperer le template Master
        try:
            master_template = Template.objects.get(slug='master')
        except Template.DoesNotExist:
            self.stdout.write(self.style.ERROR(
                'Template "master" non trouve. Creez-le d\'abord dans l\'admin.'
            ))
            return

        self.stdout.write(self.style.SUCCESS(f'Template Master trouve: {master_template}'))

        # =====================================================================
        # SECTIONS
        # =====================================================================
        sections_data = [
            # Sections generiques
            {'name': 'Hero Page', 'file': 'page_hero', 'title': 'Hero generique'},
            {'name': 'Breadcrumb', 'file': 'breadcrumb', 'title': 'Fil d\'Ariane'},
            {'name': 'CTA', 'file': 'cta', 'title': 'Call to Action'},
            {'name': 'CTA Newsletter', 'file': 'cta_newsletter', 'title': 'Inscription Newsletter'},
            {'name': 'FAQ', 'file': 'faq', 'title': 'Questions Frequentes'},
            {'name': 'Statistiques', 'file': 'stat', 'title': 'Statistiques'},
            {'name': 'Partenaires', 'file': 'partenaire', 'title': 'Nos Partenaires'},
            {'name': 'About', 'file': 'about', 'title': 'A Propos'},
            {'name': 'Slider', 'file': 'slider', 'title': 'Carousel'},

            # Programme
            {'name': 'Programme Hero', 'file': 'program_hero', 'title': 'Hero Programme'},
            {'name': 'Programme Highlights', 'file': 'program_highlights', 'title': 'Points Forts'},
            {'name': 'Programme Semestres', 'file': 'program_semesters', 'title': 'Structure du Programme'},
            {'name': 'Programme Specialisations', 'file': 'program_specializations', 'title': 'Specialisations'},

            # Candidature
            {'name': 'Info Appel Candidature', 'file': 'info-appel-candidature', 'title': 'Informations Candidature'},
            {'name': 'Documents Requis', 'file': 'current_call_documents_required', 'title': 'Documents Requis'},
            {'name': 'Timeline', 'file': 'timeline', 'title': 'Timeline Candidature'},
            {'name': 'Conditions Admission', 'file': 'requirement', 'title': 'Conditions d\'Admission'},
            {'name': 'Bourses', 'file': 'scholarship', 'title': 'Bourses et Financement'},
            {'name': 'Infos Complementaires', 'file': 'additional_info', 'title': 'Informations Complementaires'},

            # Actualites
            {'name': 'Liste Actualites', 'file': 'news_list', 'title': 'Actualites'},
            {'name': 'Grille Actualites', 'file': 'news_grid', 'title': 'Grille Actualites'},
            {'name': 'Categories News', 'file': 'news_categorie', 'title': 'Categories'},
            {'name': 'A la Une', 'file': 'alaune', 'title': 'A la Une'},
            {'name': 'Actualite', 'file': 'actualite', 'title': 'Dernieres Actualites'},

            # Evenements
            {'name': 'Liste Evenements', 'file': 'events_list', 'title': 'Evenements'},
            {'name': 'Evenements', 'file': 'event', 'title': 'Prochains Evenements'},

            # Equipe
            {'name': 'Direction', 'file': 'team_directors', 'title': 'Direction'},
            {'name': 'Professeurs', 'file': 'team_professors', 'title': 'Corps Professoral'},
            {'name': 'Doctorants', 'file': 'team_phd', 'title': 'Doctorants'},
            {'name': 'Etudiants Master', 'file': 'team_master', 'title': 'Etudiants Master'},
            {'name': 'Equipe', 'file': 'team', 'title': 'Notre Equipe'},
            {'name': 'Direction Legacy', 'file': 'direction', 'title': 'Direction'},
            {'name': 'Enseignants', 'file': 'teacher', 'title': 'Enseignants'},
            {'name': 'Doctorants Legacy', 'file': 'doctorant', 'title': 'Doctorants'},
            {'name': 'Etudiants Legacy', 'file': 'etudiant', 'title': 'Etudiants'},
            {'name': 'Alumni', 'file': 'alumni', 'title': 'Alumni'},

            # Universites
            {'name': 'Liste Universites', 'file': 'universities_list', 'title': 'Universites Partenaires'},
            {'name': 'Carte Universites', 'file': 'university_map', 'title': 'Carte Interactive'},

            # Contact
            {'name': 'Formulaire Contact', 'file': 'contact_form', 'title': 'Contactez-nous'},

            # Recherche
            {'name': 'Domaines Recherche', 'file': 'research_areas', 'title': 'Domaines de Recherche'},
            {'name': 'Projets Recherche', 'file': 'research_projects', 'title': 'Projets en Cours'},
            {'name': 'Recherche', 'file': 'research', 'title': 'Recherche'},

            # Publications
            {'name': 'Liste Publications', 'file': 'publications_list', 'title': 'Publications'},

            # Utilitaires
            {'name': 'Filtre Recherche', 'file': 'filter-search', 'title': 'Filtres'},
        ]

        sections_created = 0
        sections_map = {}

        for data in sections_data:
            # Chercher d'abord si une section existe avec ce fichier
            existing = Section.objects.filter(
                template=master_template,
                file=data['file']
            ).first()

            if existing:
                section = existing
                created = False
                if force:
                    section.name = data['name']
                    section.title = data['title']
                    section.save()
                    self.stdout.write(f'  ~ Section mise a jour: {data["name"]}')
            else:
                section = Section.objects.create(
                    template=master_template,
                    file=data['file'],
                    name=data['name'],
                    title=data['title'],
                )
                created = True
                sections_created += 1
                self.stdout.write(f'  + Section creee: {data["name"]}')

            sections_map[data['file']] = section

        self.stdout.write(self.style.SUCCESS(f'{sections_created} sections creees'))

        # =====================================================================
        # TEMPLATE FILES
        # =====================================================================
        template_files_data = [
            {'name': 'Programme', 'file': 'programme'},
            {'name': 'Comment Postuler', 'file': 'comment-postuler'},
            {'name': 'La Bourse', 'file': 'la-bourse'},
            {'name': 'Eligibilite', 'file': 'eligibilite'},
            {'name': 'Call for Application', 'file': 'call-for-application'},
            {'name': 'Actualites', 'file': 'actualites'},
            {'name': 'Evenements', 'file': 'evenements'},
            {'name': 'Equipe', 'file': 'equipe'},
            {'name': 'Universites', 'file': 'universites'},
            {'name': 'Contact', 'file': 'contact'},
            {'name': 'Recherche', 'file': 'recherche'},
            {'name': 'Publications', 'file': 'publications'},
        ]

        files_created = 0
        files_map = {}

        for data in template_files_data:
            tf, created = TemplateFile.objects.get_or_create(
                template=master_template,
                file=data['file'],
                defaults={'name': data['name']}
            )
            files_map[data['file']] = tf

            if created:
                files_created += 1
                self.stdout.write(f'  + TemplateFile cree: {data["name"]}')

        self.stdout.write(self.style.SUCCESS(f'{files_created} fichiers template crees'))

        # =====================================================================
        # PAGES
        # =====================================================================
        pages_data = [
            {
                'name': 'Programme',
                'slug': 'programme',
                'title': 'Le Programme',
                'description': 'Decouvrez notre programme de Master europeen',
                'template_file': 'programme',
                'sections': ['page_hero', 'program_highlights', 'program_semesters', 'program_specializations', 'cta']
            },
            {
                'name': 'Comment Postuler',
                'slug': 'comment-postuler',
                'title': 'Comment Postuler',
                'description': 'Toutes les etapes pour rejoindre notre programme',
                'template_file': 'comment-postuler',
                'sections': ['page_hero', 'timeline', 'requirement', 'faq', 'cta']
            },
            {
                'name': 'La Bourse',
                'slug': 'la-bourse',
                'title': 'Bourses et Financement',
                'description': 'Opportunites de financement disponibles',
                'template_file': 'la-bourse',
                'sections': ['page_hero', 'scholarship', 'faq', 'cta']
            },
            {
                'name': 'Eligibilite',
                'slug': 'eligibilite',
                'title': 'Criteres d\'Eligibilite',
                'description': 'Verifiez si vous remplissez les conditions',
                'template_file': 'eligibilite',
                'sections': ['page_hero', 'requirement', 'faq', 'cta']
            },
            {
                'name': 'Appel a Candidature',
                'slug': 'call-for-application',
                'title': 'Appel a Candidature',
                'description': 'Postulez maintenant pour la prochaine rentree',
                'template_file': 'call-for-application',
                'sections': ['page_hero', 'info-appel-candidature', 'timeline', 'current_call_documents_required', 'requirement', 'scholarship', 'faq']
            },
            {
                'name': 'Actualites',
                'slug': 'actualites',
                'title': 'Actualites',
                'description': 'Les dernieres nouvelles du programme',
                'template_file': 'actualites',
                'sections': ['page_hero', 'news_list', 'cta_newsletter']
            },
            {
                'name': 'Evenements',
                'slug': 'evenements',
                'title': 'Evenements',
                'description': 'Conferences, seminaires et ateliers',
                'template_file': 'evenements',
                'sections': ['page_hero', 'events_list', 'cta_newsletter']
            },
            {
                'name': 'Notre Equipe',
                'slug': 'equipe',
                'title': 'Notre Equipe',
                'description': 'Decouvrez les membres du programme',
                'template_file': 'equipe',
                'sections': ['page_hero', 'team_directors', 'team_professors', 'team_phd', 'team_master']
            },
            {
                'name': 'Universites Partenaires',
                'slug': 'universites',
                'title': 'Universites Partenaires',
                'description': 'Notre reseau d\'universites europeennes',
                'template_file': 'universites',
                'sections': ['page_hero', 'university_map', 'universities_list']
            },
            {
                'name': 'Contact',
                'slug': 'contact',
                'title': 'Contactez-nous',
                'description': 'Nous sommes la pour repondre a vos questions',
                'template_file': 'contact',
                'sections': ['page_hero', 'contact_form', 'cta_newsletter']
            },
            {
                'name': 'Recherche',
                'slug': 'recherche',
                'title': 'Recherche',
                'description': 'Nos projets et domaines de recherche',
                'template_file': 'recherche',
                'sections': ['page_hero', 'research_areas', 'research_projects', 'cta']
            },
            {
                'name': 'Publications',
                'slug': 'publications',
                'title': 'Publications',
                'description': 'Articles et travaux de recherche',
                'template_file': 'publications',
                'sections': ['page_hero', 'publications_list']
            },
        ]

        pages_created = 0
        pagesections_created = 0

        for data in pages_data:
            template_file = files_map.get(data['template_file'])

            page, created = Page.objects.get_or_create(
                slug=data['slug'],
                defaults={
                    'name': data['name'],
                    'title': data['title'],
                    'description': data['description'],
                    'template': master_template,
                    'template_file': template_file,
                    'is_active': True,
                }
            )

            if created:
                pages_created += 1
                self.stdout.write(f'  + Page creee: {data["name"]}')

                # Creer les PageSection
                for order, section_file in enumerate(data['sections'], start=1):
                    section = sections_map.get(section_file)
                    if section:
                        PageSection.objects.create(
                            page=page,
                            section=section,
                            order=order
                        )
                        pagesections_created += 1
                        self.stdout.write(f'    - Section ajoutee: {section.name} (ordre {order})')
                    else:
                        self.stdout.write(self.style.WARNING(
                            f'    ! Section non trouvee: {section_file}'
                        ))

            elif force:
                # Mettre a jour la page
                page.name = data['name']
                page.title = data['title']
                page.description = data['description']
                page.template_file = template_file
                page.save()
                self.stdout.write(f'  ~ Page mise a jour: {data["name"]}')

                # Supprimer et recreer les PageSection
                page.pagesection_set.all().delete()
                for order, section_file in enumerate(data['sections'], start=1):
                    section = sections_map.get(section_file)
                    if section:
                        PageSection.objects.create(
                            page=page,
                            section=section,
                            order=order
                        )
                        pagesections_created += 1

        self.stdout.write(self.style.SUCCESS(
            f'\nResume:\n'
            f'  - {sections_created} sections creees\n'
            f'  - {files_created} fichiers template crees\n'
            f'  - {pages_created} pages creees\n'
            f'  - {pagesections_created} associations PageSection creees'
        ))

        self.stdout.write(self.style.SUCCESS('\nConfiguration CMS terminee!'))
