"""
Commande pour initialiser les champs personnalises des sections.
"""
from django.core.management.base import BaseCommand
from cms.models import Section, SectionField


# Definition des champs par section (fichier de template)
SECTION_FIELDS = {
    'about': [
        {
            'name': 'specific_image',
            'label': 'Image specifique',
            'field_type': 'image',
            'required': False,
            'help_text': 'Image specifique pour cette page (remplace l\'image par defaut de la section)',
            'order': 1,
        },
        {
            'name': 'first_line',
            'label': 'Premiere ligne du badge',
            'field_type': 'text',
            'required': False,
            'help_text': 'Texte principal du badge flottant (ex: "10+")',
            'order': 2,
        },
        {
            'name': 'second_line',
            'label': 'Deuxieme ligne du badge',
            'field_type': 'text',
            'required': False,
            'help_text': 'Texte secondaire du badge (ex: "Annees d\'experience")',
            'order': 3,
        },
        {
            'name': 'vertical_position',
            'label': 'Position verticale du badge',
            'field_type': 'select',
            'required': False,
            'default_value': 'bottom',
            'choices': 'bottom|Bas\ntop|Haut',
            'help_text': 'Position verticale du badge sur l\'image',
            'order': 4,
        },
        {
            'name': 'horizontal_position',
            'label': 'Position horizontale du badge',
            'field_type': 'select',
            'required': False,
            'default_value': 'left',
            'choices': 'left|Gauche\nright|Droite',
            'help_text': 'Position horizontale du badge sur l\'image',
            'order': 5,
        },
    ],
    'hero': [
        {
            'name': 'background_image',
            'label': 'Image de fond',
            'field_type': 'image',
            'required': False,
            'help_text': 'Image de fond specifique pour cette page',
            'order': 1,
        },
        {
            'name': 'button_text',
            'label': 'Texte du bouton',
            'field_type': 'text',
            'required': False,
            'default_value': 'En savoir plus',
            'help_text': 'Texte affiche sur le bouton principal',
            'order': 2,
        },
        {
            'name': 'button_url',
            'label': 'URL du bouton',
            'field_type': 'url',
            'required': False,
            'help_text': 'Lien du bouton principal',
            'order': 3,
        },
        {
            'name': 'show_stats',
            'label': 'Afficher les statistiques',
            'field_type': 'boolean',
            'required': False,
            'default_value': 'true',
            'help_text': 'Afficher ou masquer les statistiques',
            'order': 4,
        },
    ],
    'statistics': [
        {
            'name': 'columns',
            'label': 'Nombre de colonnes',
            'field_type': 'select',
            'required': False,
            'default_value': '4',
            'choices': '2|2 colonnes\n3|3 colonnes\n4|4 colonnes\n5|5 colonnes',
            'help_text': 'Nombre de colonnes pour afficher les statistiques',
            'order': 1,
        },
        {
            'name': 'background_color',
            'label': 'Couleur de fond',
            'field_type': 'select',
            'required': False,
            'default_value': 'primary',
            'choices': 'primary|Primaire\nsecondary|Secondaire\nwhite|Blanc\ngray|Gris',
            'help_text': 'Couleur de fond de la section',
            'order': 2,
        },
    ],
    'partners': [
        {
            'name': 'display_mode',
            'label': 'Mode d\'affichage',
            'field_type': 'select',
            'required': False,
            'default_value': 'grid',
            'choices': 'grid|Grille\ncarousel|Carrousel\nlist|Liste',
            'help_text': 'Comment afficher les partenaires',
            'order': 1,
        },
        {
            'name': 'max_items',
            'label': 'Nombre maximum',
            'field_type': 'integer',
            'required': False,
            'default_value': '12',
            'help_text': 'Nombre maximum de partenaires a afficher',
            'order': 2,
        },
    ],
    'contact': [
        {
            'name': 'show_map',
            'label': 'Afficher la carte',
            'field_type': 'boolean',
            'required': False,
            'default_value': 'true',
            'help_text': 'Afficher ou masquer la carte Google Maps',
            'order': 1,
        },
        {
            'name': 'form_title',
            'label': 'Titre du formulaire',
            'field_type': 'text',
            'required': False,
            'default_value': 'Envoyez-nous un message',
            'help_text': 'Titre affiche au-dessus du formulaire',
            'order': 2,
        },
    ],
    'university_map': [
        {
            'name': 'title',
            'label': 'Titre de la section',
            'field_type': 'text',
            'required': False,
            'help_text': 'Titre affiche au-dessus de la carte (laissez vide pour utiliser le titre par defaut)',
            'order': 1,
        },
        {
            'name': 'subtitle',
            'label': 'Sous-titre',
            'field_type': 'textarea',
            'required': False,
            'help_text': 'Description affichee sous le titre',
            'order': 2,
        },
        {
            'name': 'map_height',
            'label': 'Hauteur de la carte (px)',
            'field_type': 'integer',
            'required': False,
            'default_value': '450',
            'help_text': 'Hauteur de la carte en pixels',
            'order': 3,
        },
        {
            'name': 'show_list',
            'label': 'Afficher la liste des universites',
            'field_type': 'boolean',
            'required': False,
            'default_value': 'true',
            'help_text': 'Afficher la liste des universites sous la carte',
            'order': 4,
        },
        {
            'name': 'show_link',
            'label': 'Afficher le lien "Voir toutes"',
            'field_type': 'boolean',
            'required': False,
            'default_value': 'true',
            'help_text': 'Afficher le lien vers la page des universites',
            'order': 5,
        },
        {
            'name': 'link_text',
            'label': 'Texte du lien',
            'field_type': 'text',
            'required': False,
            'default_value': 'Voir toutes les universites',
            'help_text': 'Texte du lien vers la page des universites',
            'order': 6,
        },
    ],
}


class Command(BaseCommand):
    help = 'Initialise les champs personnalises des sections'

    def add_arguments(self, parser):
        parser.add_argument(
            '--section',
            type=str,
            help='Nom du fichier de section (ex: about, hero)',
        )
        parser.add_argument(
            '--force',
            action='store_true',
            help='Mettre a jour les champs existants',
        )

    def handle(self, *args, **options):
        section_filter = options.get('section')
        force_update = options.get('force', False)

        sections_to_process = SECTION_FIELDS
        if section_filter:
            if section_filter in SECTION_FIELDS:
                sections_to_process = {section_filter: SECTION_FIELDS[section_filter]}
            else:
                self.stdout.write(
                    self.style.ERROR(f'Section "{section_filter}" non trouvee dans la configuration')
                )
                self.stdout.write(f'Sections disponibles: {", ".join(SECTION_FIELDS.keys())}')
                return

        total_created = 0
        total_updated = 0

        for section_file, fields in sections_to_process.items():
            # Trouver la section par son fichier
            sections = Section.objects.filter(file=section_file)

            if not sections.exists():
                self.stdout.write(
                    self.style.WARNING(f'Aucune section avec le fichier "{section_file}.html" trouvee')
                )
                continue

            for section in sections:
                self.stdout.write(f'\nSection: {section.name} ({section.file}.html)')

                for field_data in fields:
                    field, created = SectionField.objects.get_or_create(
                        section=section,
                        name=field_data['name'],
                        defaults={
                            'label': field_data['label'],
                            'field_type': field_data['field_type'],
                            'required': field_data.get('required', False),
                            'default_value': field_data.get('default_value', ''),
                            'help_text': field_data.get('help_text', ''),
                            'choices': field_data.get('choices', ''),
                            'order': field_data.get('order', 0),
                        }
                    )

                    if created:
                        total_created += 1
                        self.stdout.write(
                            self.style.SUCCESS(f'  + Cree: {field.label} ({field.field_type})')
                        )
                    elif force_update:
                        # Mettre a jour les champs existants
                        field.label = field_data['label']
                        field.field_type = field_data['field_type']
                        field.required = field_data.get('required', False)
                        field.default_value = field_data.get('default_value', '')
                        field.help_text = field_data.get('help_text', '')
                        field.choices = field_data.get('choices', '')
                        field.order = field_data.get('order', 0)
                        field.save()
                        total_updated += 1
                        self.stdout.write(
                            self.style.WARNING(f'  ~ Mis a jour: {field.label}')
                        )
                    else:
                        self.stdout.write(f'  - Existe deja: {field.label}')

        self.stdout.write('')
        self.stdout.write(self.style.SUCCESS(
            f'Termine: {total_created} champ(s) cree(s), {total_updated} mis a jour'
        ))
