from django import forms
from django.forms import inlineformset_factory
from .models import (
    ProcesVerbal, Client, Participant,  
    ControleResultat, Photo, Recommandation, TypePV, Ouvrage, ElementOuvrage,ProcesVerbal
)
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Layout, Row, Column, Submit, Fieldset, HTML



class ProcesVerbalForm(forms.ModelForm):
    class Meta:
        model = ProcesVerbal
        fields = ['numero','type_pv','client', 'date_visite', 'lieu', 'objet_controle', 'observations_generales']
        labels = {
            'numero': 'Numéro du PV',
            'type_pv': 'Type de PV',
            'client': 'Client',
            'date_visite': 'Date de visite',
            'lieu': 'Lieu de contrôle',
            'objet_controle': "Objet du contrôle",
            'observations_generales': "Observations générales",
        }
        widgets = {
            'date_visite': forms.DateTimeInput(attrs={
                'type': 'datetime-local',
                'class': 'form-control',
                'step': '1'  # Permet de sélectionner l'heure avec précision
            }),
            'numero': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Numéro du PV'}),
            'type_pv': forms.Select(attrs={'class': 'form-select'}),
            'client': forms.Select(attrs={'class': 'form-select'}),
            'lieu': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Lieu de contrôle'}),
            'objet_controle': forms.Select(attrs={
                'class': 'form-select'
            }),
            'observations_generales': forms.Textarea(attrs={
                'rows': 3, 
                'class': 'form-control',
                'placeholder': "Entrez vos observations générales"
                }),
        }
    
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        # Retirer le champ numero en création car il est généré automatiquement
        if self.instance is None or self.instance.pk is None:
            self.fields.pop('numero', None)
        
         # Configurer le champ type_pv avec les bons choix
        self.fields['type_pv'].queryset = TypePV.objects.all().order_by('type_pv')
        self.fields['type_pv'].empty_label = "Sélectionnez un type de PV"
        self.fields['type_pv'].widget.attrs.update({
            'class': 'form-select',
            'id': 'id_type_pv',
            'required': 'required'
        })
  
        # Ajouter des classes CSS
        self.fields['client'].widget.attrs.update({'class': 'form-select'})
        self.fields['client'].empty_label = "Sélectionnez un client"
        self.fields['lieu'].widget.attrs.update({'class': 'form-control'})

        # Configuration spécifique pour date_visite
        if 'date_visite' in self.fields:
            self.fields['date_visite'].widget.attrs.update({'class': 'form-control'})
            # Si l'instance existe, formater la date pour datetime-local
            if self.instance and self.instance.date_visite:
                # Formater la date au format requis par datetime-local: YYYY-MM-DDThh:mm
                from datetime import datetime
                if isinstance(self.instance.date_visite, datetime):
                    self.initial['date_visite'] = self.instance.date_visite.strftime('%Y-%m-%dT%H:%M')
        
        # Configurer crispy forms
        self.helper = FormHelper()
        self.helper.layout = Layout(
            Row(
                Column('type_pv', css_class='col-md-6 mb-3'),
                Column('client', css_class='col-md-6 mb-3'),
                css_class='row'
            ),
            Row(
                Column('date_visite', css_class='col-md-6 mb-3'),
                Column('lieu', css_class='col-md-6 mb-3'),
                css_class='row'
            ),
            Row(
                Column('objet_controle', css_class='col-12 mb-3'),
                css_class='row'
            ),
            Row(
                Column('observations_generales', css_class='col-12 mb-3'),
                css_class='row'
            ),
            Submit('submit', 'Enregistrer', css_class='btn btn-success')
        )
    
    def save(self, commit=True):
        instance = super().save(commit=False)
        if commit:
            instance.save()
        return instance

class ControleResultatForm(forms.ModelForm):
    """Formulaire de résultat de contrôle.

    Le modèle a été refactorisé : la clé est désormais ``point_controle``
    (référence à ``PointControle``) et les champs ``statut`` / ``observation``.
    Nous exposons des étiquettes claires et conservons le nom ``resultat``
    pour faciliter la migration des templates.
    """

    class Meta:
        model = ControleResultat
        # inclure les champs du modèle ciblés, ils seront renommés dans les templates
        fields = ['point_controle', 'statut', 'observation']
        widgets = {
            'point_controle': forms.Select(attrs={'class': 'form-select'}),
            'statut': forms.Select(attrs={'class': 'form-select'}),
            'observation': forms.Textarea(attrs={'rows': 2, 'class': 'form-control'}),
        }
        labels = {
            'point_controle': 'Élément / point de contrôle',
            'statut': 'Résultat',
            'observation': 'Observation',
        }

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # Renommer les champs pour que les templates puissent utiliser rapidement
        # ``element`` et ``resultat`` si on ne veut pas modifier tous les noms.
        self.fields['point_controle'].widget.attrs.update({'class': 'form-select'})

    # Pour que les templates qui s'attendent à ``controle_form.element``
    # ou ``controle_form.resultat`` continuent de fonctionner, on ajoute des
    # propriétés dynamiques.
    @property
    def element(self):
        return self['point_controle']

    @property
    def resultat(self):
        return self['statut']
    

class ParticipantFormSet(forms.ModelForm):
    class Meta:
        model = Participant
        fields = ['nom']
        widgets = {
            'nom': forms.TextInput(attrs={'placeholder': 'Nom du participant'})
        }

class PhotoForm(forms.ModelForm):
    class Meta:
        model = Photo
        fields = ['image', 'legende']
        widgets = {
            'legende': forms.TextInput(attrs={'placeholder': 'Légende de la photo'})
        }

class RecommandationForm(forms.ModelForm):
    class Meta:
        model = Recommandation
        fields = ['texte', 'ordre']
        widgets = {
            'texte': forms.Textarea(attrs={'rows': 2}),
        }

# Définissez d'abord le ModelForm de base
class ParticipantForm(forms.ModelForm):
    class Meta:
        model = Participant
        fields = ['nom', 'fonction', 'organisme', 'signature']
        widgets = {
            'nom': forms.TextInput(attrs={
                'class': 'form-control',
                'placeholder': 'Nom du participant',
                'required': True
            }),
            'fonction': forms.TextInput(attrs={
                'class': 'form-control',
                'placeholder': 'Fonction'
            }),
            'organisme': forms.TextInput(attrs={
                'class': 'form-control',
                'placeholder': 'Organisme'
            }),
            'signature': forms.HiddenInput()
        }
    
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # S'assurer que le champ signature est facultatif
        self.fields['signature'].required = False

# Utilisez inlineformset_factory car Participant a une ForeignKey vers ProcesVerbal
ParticipantFormSet = inlineformset_factory(
    ProcesVerbal,
    Participant,
    form=ParticipantForm,
    fields=('nom', 'fonction', 'organisme', 'signature'),
    extra=1,
    can_delete=True
)


class SignatureForm(forms.Form):
    signature_data = forms.CharField(widget=forms.HiddenInput())
    participant_id = forms.IntegerField(widget=forms.HiddenInput())


class EmailForm(forms.Form):
    destinataires = forms.CharField(
        label='Adresses email',
        help_text='Séparez les adresses par des virgules',
        widget=forms.Textarea(attrs={'rows': 3, 'placeholder': 'email1@example.com, email2@example.com'})
    )
    message = forms.CharField(
        label='Message personnel',
        required=False,
        widget=forms.Textarea(attrs={'rows': 4})
    )

# Formsets
ControleResultatFormSet = inlineformset_factory(
    ProcesVerbal, ControleResultat, form=ControleResultatForm,
    extra=1, can_delete=True
)

PhotoFormSet = inlineformset_factory(
    ControleResultat, Photo, form=PhotoForm,
    extra=1, can_delete=True
)

RecommandationFormSet = inlineformset_factory(
    ProcesVerbal, Recommandation, form=RecommandationForm,
    extra=1, can_delete=True
)

