"""
Formulaires pour le CMS.
"""
from decimal import Decimal
from django import forms
from .models import SectionField, PageSectionFieldValue


class PageSectionFieldValueForm(forms.Form):
    """
    Formulaire dynamique pour les valeurs de champs personnalises.
    Genere les champs en fonction des SectionField definis.
    """

    def __init__(self, *args, page_section=None, **kwargs):
        super().__init__(*args, **kwargs)
        self.page_section = page_section

        if not page_section or not page_section.section_id:
            return

        # Recuperer tous les champs personnalises pour cette section
        section_fields = SectionField.objects.filter(
            section_id=page_section.section_id
        ).order_by('order')

        # Recuperer les valeurs existantes
        existing_values = {}
        if page_section.pk:
            existing_values = {
                fv.field_id: fv
                for fv in page_section.field_values.select_related('field').all()
            }

        # Generer les champs de formulaire dynamiquement
        for section_field in section_fields:
            field_name = f'field_{section_field.id}'
            initial_value = None

            if section_field.id in existing_values:
                initial_value = existing_values[section_field.id].get_value()
            elif section_field.default_value:
                initial_value = section_field.default_value

            form_field = self._create_form_field(section_field, initial_value)
            self.fields[field_name] = form_field

    def _create_form_field(self, section_field, initial_value):
        """Cree un champ de formulaire Django selon le type."""
        common_attrs = {
            'label': section_field.label,
            'required': section_field.required,
            'help_text': section_field.help_text,
            'initial': initial_value,
        }

        widget_attrs = {
            'class': 'vTextField',  # Style Django admin
        }

        if section_field.field_type == 'text':
            return forms.CharField(
                max_length=500,
                widget=forms.TextInput(attrs=widget_attrs),
                **common_attrs
            )

        elif section_field.field_type == 'textarea':
            widget_attrs['rows'] = 4
            widget_attrs['class'] = 'vLargeTextField'
            return forms.CharField(
                widget=forms.Textarea(attrs=widget_attrs),
                **common_attrs
            )

        elif section_field.field_type == 'boolean':
            return forms.BooleanField(
                widget=forms.CheckboxInput(),
                **{**common_attrs, 'required': False}  # Boolean jamais requis
            )

        elif section_field.field_type == 'integer':
            return forms.IntegerField(
                widget=forms.NumberInput(attrs=widget_attrs),
                **common_attrs
            )

        elif section_field.field_type == 'decimal':
            return forms.DecimalField(
                max_digits=10,
                decimal_places=2,
                widget=forms.NumberInput(attrs={**widget_attrs, 'step': '0.01'}),
                **common_attrs
            )

        elif section_field.field_type == 'url':
            return forms.URLField(
                widget=forms.URLInput(attrs=widget_attrs),
                **common_attrs
            )

        elif section_field.field_type == 'email':
            return forms.EmailField(
                widget=forms.EmailInput(attrs=widget_attrs),
                **common_attrs
            )

        elif section_field.field_type == 'image':
            return forms.ImageField(
                widget=forms.ClearableFileInput(),
                **{**common_attrs, 'required': False}
            )

        elif section_field.field_type == 'select':
            choices = [('', '--- Selectionner ---')] + section_field.get_choices_list()
            return forms.ChoiceField(
                choices=choices,
                widget=forms.Select(attrs=widget_attrs),
                **common_attrs
            )

        # Par defaut: texte
        return forms.CharField(
            widget=forms.TextInput(attrs=widget_attrs),
            **common_attrs
        )

    def save(self):
        """Sauvegarde les valeurs des champs personnalises."""
        if not self.page_section or not self.page_section.pk:
            return

        section_fields = {
            f.id: f for f in SectionField.objects.filter(
                section_id=self.page_section.section_id
            )
        }

        for field_name, value in self.cleaned_data.items():
            if not field_name.startswith('field_'):
                continue

            field_id = int(field_name.split('_')[1])
            section_field = section_fields.get(field_id)

            if not section_field:
                continue

            field_value, _ = PageSectionFieldValue.objects.get_or_create(
                page_section=self.page_section,
                field=section_field
            )

            # Gerer le champ image separement
            if section_field.field_type == 'image':
                if value:
                    field_value.image_value = value
            else:
                field_value.set_value(value)

            field_value.save()
