from django import forms
from django.utils import timezone
from django.forms import inlineformset_factory
from .models import Dossier, Paiement, Client, Proforma, LigneProforma, Service, TypeService, Proforma_model2, LigneProforma_model2, Proforma_model3, LigneProforma_model3

class ClientForm(forms.ModelForm):
    class Meta:
        model = Client
        fields = ['nom', 'nif', 'adresse', 'email', 'telephone', 'client_type']
        widgets = {
            'nom': forms.TextInput(attrs={'class': 'form-control'}),
            'nif': forms.TextInput(attrs={'class': 'form-control'}),
            'adresse': forms.Textarea(attrs={'class': 'form-control', 'rows': 3}),
            'email': forms.EmailInput(attrs={'class': 'form-control'}),
            'telephone': forms.TextInput(attrs={'class': 'form-control'}),
            'client_type': forms.Select(attrs={'class': 'form-control select2'}),
        }

class DossierForm(forms.ModelForm):
    class Meta:
        model = Dossier
        exclude = ['date_ouverture', 'statut', 'created_at', 'updated_at']
        widgets = {
            'numero': forms.TextInput(attrs={'class': 'form-control'}),
            'date_arrivee': forms.DateInput(attrs={'type': 'date', 'class': 'form-control'}),
            'date_manifeste': forms.DateInput(attrs={'type': 'date', 'class': 'form-control'}),
            'date_laisser_suivre': forms.DateInput(attrs={'type': 'date', 'class': 'form-control'}),
            'date_reserves': forms.DateInput(attrs={'type': 'date', 'class': 'form-control'}),
            'validite_fiscale_du': forms.DateInput(attrs={'type': 'date', 'class': 'form-control'}),
            'validite_fiscale_au': forms.DateInput(attrs={'type': 'date', 'class': 'form-control'}),
            'date_declaration_dgda': forms.DateInput(attrs={'type': 'date', 'class': 'form-control'}),
            'date_bordereau_versement': forms.DateInput(attrs={'type': 'date', 'class': 'form-control'}),
            'date_bordereau_versement_fb': forms.DateInput(attrs={'type': 'date', 'class': 'form-control'}),
            'date_bulletin_liquidation': forms.DateInput(attrs={'type': 'date', 'class': 'form-control'}),
            'date_bon_a_enlever': forms.DateInput(attrs={'type': 'date', 'class': 'form-control'}),
            'date_bon_de_sortie': forms.DateInput(attrs={'type': 'date', 'class': 'form-control'}),
            'date_enlevement_autorise': forms.DateInput(attrs={'type': 'date', 'class': 'form-control'}),
            'date_declaration_exoneration': forms.DateInput(attrs={'type': 'date', 'class': 'form-control'}),
            'date_transit_magasinage': forms.DateInput(attrs={'type': 'date', 'class': 'form-control'}),
            'date_recu_occ': forms.DateInput(attrs={'type': 'date', 'class': 'form-control'}),
            'date_note_debit_occ': forms.DateInput(attrs={'type': 'date', 'class': 'form-control'}),
            'date_rapport_controle_occ': forms.DateInput(attrs={'type': 'date', 'class': 'form-control'}),
            'date_introduction_douane': forms.DateInput(attrs={'type': 'date', 'class': 'form-control'}),
            'date_verification': forms.DateInput(attrs={'type': 'date', 'class': 'form-control'}),
            'date_paiement_douane': forms.DateInput(attrs={'type': 'date', 'class': 'form-control'}),
            'date_sortie_douane': forms.DateInput(attrs={'type': 'date', 'class': 'form-control'}),
            'date_bon_livraison': forms.DateInput(attrs={'type': 'date', 'class': 'form-control'}),
            'date_transm_documents': forms.DateInput(attrs={'type': 'date', 'class': 'form-control'}),
            'client': forms.Select(attrs={'class': 'form-select select2'}),
            'type_dossier': forms.Select(attrs={'class': 'form-select select2'}),
            'description': forms.TextInput(attrs={'class': 'form-control'}),
        }

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        
        # If dossier is already created, check if it has unpaid invoices to allow editing
        instance = getattr(self, 'instance', None)
        if instance and instance.pk:
            # Check invoices status logic here if needed for specific field readonly
            # The requirement is: "quand un dossier ne pas encore payé que tu me donnes la possibilité aussi de modifier les informations"
            # Standard django form behavior allows editing. We need to ensure the View doesn't block it.
            # But we might want to prevent editing "Fiscal" or "Customs" critical data if invoiced?
            # User said: "modifier les informations du Dossier (cad les champs vol, date_arrivee, ...)"
            # So we keep fields editable by default.
            pass
        
        # Set today's date as default for all date fields if this is a new form
        if not self.is_bound and (not self.instance or not self.instance.pk):
            today = timezone.now().strftime('%Y-%m-%d')
            date_fields = [
                'date_arrivee', 'date_manifeste', 'date_laisser_suivre', 'date_reserves',
                'validite_fiscale_du', 'validite_fiscale_au', 'date_declaration_dgda',
                'date_bordereau_versement', 'date_bordereau_versement_fb', 'date_bulletin_liquidation',
                'date_bon_a_enlever', 'date_bon_de_sortie', 'date_enlevement_autorise',
                'date_declaration_exoneration', 'date_transit_magasinage', 'date_recu_occ',
                'date_note_debit_occ', 'date_rapport_controle_occ', 'date_introduction_douane',
                'date_verification', 'date_paiement_douane', 'date_sortie_douane', 
                'date_bon_livraison', 'date_transm_documents'
            ]
            for field in date_fields:
                if field in self.fields:
                    self.fields[field].initial = today

        # Add form-control class to all fields by default if not set
        for field_name, field in self.fields.items():
            if hasattr(field.widget, 'attrs') and 'class' not in field.widget.attrs:
                field.widget.attrs['class'] = 'form-control'

class PaiementForm(forms.ModelForm):
    class Meta:
        model = Paiement
        fields = ['montant', 'devise', 'date_paiement', 'reference']
        widgets = {
            'date_paiement': forms.DateInput(attrs={'type': 'date', 'class': 'form-control'}),
            'montant': forms.NumberInput(attrs={'class': 'form-control'}),
            'devise': forms.Select(attrs={'class': 'form-control'}),
            'reference': forms.TextInput(attrs={'class': 'form-control'}),
        }


class ProformaForm(forms.ModelForm):
    class Meta:
        model = Proforma
        fields = ['type_proforma', 'client', 'objet', 'date_emission', 'commentaire']
        widgets = {
            'type_proforma': forms.Select(attrs={'class': 'form-select'}),
            'client': forms.Select(attrs={'class': 'form-select select2'}),
            'objet': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Ex: Études architecturales – Projet X'}),
            'date_emission': forms.DateTimeInput(attrs={'type': 'datetime-local', 'class': 'form-control'}),
            'commentaire': forms.Textarea(attrs={'class': 'form-control', 'rows': 5, 'placeholder': 'Ex: A l\'Attention de Monsieur Jean MABI\nDirecteur Général du BCECO\nKinshasa-Gombe'}),
        }

    def __init__(self, *args, **kwargs):
        initial_type = kwargs.pop('initial_type', None)
        super().__init__(*args, **kwargs)
        # Auto-remplir la date/heure actuelle pour une nouvelle proforma
        if not self.instance.pk:
            now_str = timezone.now().strftime('%Y-%m-%dT%H:%M')
            self.fields['date_emission'].initial = now_str
            self.fields['date_emission'].widget.attrs['value'] = now_str
            if initial_type:
                self.fields['type_proforma'].initial = initial_type


class LigneProformaForm(forms.ModelForm):
    class Meta:
        model = LigneProforma
        fields = ['designation', 'description', 'quantite', 'prix_unitaire', 'devise']
        widgets = {
            'designation': forms.TextInput(attrs={'class': 'form-control'}),
            'description': forms.Textarea(attrs={'class': 'form-control', 'rows': 2}),
            'quantite': forms.NumberInput(attrs={'class': 'form-control qty-input', 'step': '0.01', 'min': '0'}),
            'prix_unitaire': forms.NumberInput(attrs={'class': 'form-control pu-input', 'step': '0.01', 'min': '0'}),
            'devise': forms.Select(attrs={'class': 'form-select'}),
        }


LigneProformaFormSet = inlineformset_factory(
    Proforma, LigneProforma,
    form=LigneProformaForm,
    extra=3,
    can_delete=True,
)


class ProformaM2Form(forms.ModelForm):
    class Meta:
        model = Proforma_model2
        fields = ['type_proforma', 'client', 'objet', 'date_emission', 'montant_marche', 'montant_demande', 'montant_sollicite', 'commentaire']
        widgets = {
            'type_proforma': forms.Select(attrs={'class': 'form-select'}),
            'client': forms.Select(attrs={'class': 'form-select select2'}),
            'objet': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Ex: Études architecturales – Projet X'}),
            'date_emission': forms.DateTimeInput(attrs={'type': 'datetime-local', 'class': 'form-control'}),
            'montant_marche': forms.NumberInput(attrs={'class': 'form-control', 'step': '0.01'}),
            'montant_demande': forms.NumberInput(attrs={'class': 'form-control', 'step': '0.01'}),
            'montant_sollicite': forms.NumberInput(attrs={'class': 'form-control', 'step': '0.01'}),
            'commentaire': forms.Textarea(attrs={'class': 'form-control', 'rows': 4, 'placeholder': 'Ex: A l\'Attention de Monsieur Jean MABI\nDirecteur Général'}),
        }

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        if not self.instance.pk:
            now_str = timezone.now().strftime('%Y-%m-%dT%H:%M')
            self.fields['date_emission'].initial = now_str
            self.fields['date_emission'].widget.attrs['value'] = now_str


class LigneProformaM2Form(forms.ModelForm):
    class Meta:
        model = LigneProforma_model2
        fields = ['ordre', 'designation', 'montant_marche', 'montant_demande']
        widgets = {
            'ordre': forms.NumberInput(attrs={'class': 'form-control', 'min': '1', 'style': 'width:60px'}),
            'designation': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Ex: Étape 1 - Définition stratégique'}),
            'montant_marche': forms.NumberInput(attrs={'class': 'form-control', 'step': '0.01', 'min': '0'}),
            'montant_demande': forms.NumberInput(attrs={'class': 'form-control', 'step': '0.01', 'min': '0'}),
        }


LigneProformaM2FormSet = inlineformset_factory(
    Proforma_model2, LigneProforma_model2,
    form=LigneProformaM2Form,
    extra=3,
    can_delete=True,
)


class ProformaM3Form(forms.ModelForm):
    class Meta:
        model = Proforma_model3
        fields = ['type_proforma', 'client', 'objet', 'date_emission', 'commentaire']
        widgets = {
            'type_proforma': forms.Select(attrs={'class': 'form-select'}),
            'client': forms.Select(attrs={'class': 'form-select select2'}),
            'objet': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Ex: Études architecturales – Projet X'}),
            'date_emission': forms.DateTimeInput(attrs={'type': 'datetime-local', 'class': 'form-control'}),
            'commentaire': forms.Textarea(attrs={'class': 'form-control', 'rows': 4, 'placeholder': 'Ex: A l\'Attention de Monsieur Jean MABI\nDirecteur Général'}),
        }

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        if not self.instance.pk:
            now_str = timezone.now().strftime('%Y-%m-%dT%H:%M')
            self.fields['date_emission'].initial = now_str
            self.fields['date_emission'].widget.attrs['value'] = now_str


class LigneProformaM3Form(forms.ModelForm):
    class Meta:
        model = LigneProforma_model3
        fields = ['ordre', 'designation', 'montant_marche', 'montant_percu', 'montant_restant', 'montant_sollicite']
        widgets = {
            'ordre': forms.NumberInput(attrs={'class': 'form-control', 'min': '1', 'style': 'width:60px'}),
            'designation': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Ex: Étape 1'}),
            'montant_marche': forms.NumberInput(attrs={'class': 'form-control', 'step': '0.01', 'min': '0'}),
            'montant_percu': forms.NumberInput(attrs={'class': 'form-control', 'step': '0.01', 'min': '0'}),
            'montant_restant': forms.NumberInput(attrs={'class': 'form-control', 'step': '0.01', 'min': '0'}),
            'montant_sollicite': forms.NumberInput(attrs={'class': 'form-control', 'step': '0.01', 'min': '0'}),
        }


LigneProformaM3FormSet = inlineformset_factory(
    Proforma_model3, LigneProforma_model3,
    form=LigneProformaM3Form,
    extra=3,
    can_delete=True,
)
