from django import forms
from datetime import datetime
from decimal import Decimal, InvalidOperation
from .models import Movimiento, Cuenta, Categoria
from django.utils.translation import gettext_lazy as _
from datetime import date
import calendar


class MovimientoForm(forms.ModelForm):
    monto = forms.CharField()

    class Meta:
        model = Movimiento
        fields = ['cuenta_origen', 'cuenta_destino', 'monto', 'fecha', 'descripcion', 'categoria']
        widgets = {
            'cuenta_origen': forms.Select(attrs={'class': 'form-control'}),
            'cuenta_destino': forms.Select(attrs={'class': 'form-control'}),
            'monto': forms.TextInput(attrs={'class': 'form-control'}),
            'descripcion': forms.Textarea(attrs={'class': 'form-control', 'rows': 3}),
            'fecha': forms.DateTimeInput(attrs={'type': 'datetime-local', 'class': 'form-control', 'placeholder': 'MM-DD-YYYY'}, format='%Y-%m-%dT%H:%M'),
            'categoria': forms.Select(attrs={'class': 'form-control'}),
        }

    def clean(self):
        cleaned_data = super().clean()
        origen = cleaned_data.get('cuenta_origen')
        destino = cleaned_data.get('cuenta_destino')
        if origen and destino and origen == destino:
            raise forms.ValidationError("La cuenta de origen y la de destino no pueden ser la misma.")

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # self.fields['fecha'].input_formats = ['%d-%m-%YT%H:%M']
        if 'monto' in self.initial:
            self.initial['monto'] = str(self.initial['monto']).replace('.', ',')
        elif self.instance and self.instance.pk:
            self.fields['monto'].initial = str(self.instance.monto).replace('.', ',')

    def clean_monto(self):
        valor = self.cleaned_data['monto'].replace(',', '.')
        try:
            return Decimal(valor)
        except InvalidOperation:
            raise forms.ValidationError("Introduzca un número válido. Puede usar coma o punto como separador decimal.")


class FiltroMesAnioForm(forms.Form):
    MESES = [
        (1, _('Enero')),
        (2, _('Febrero')),
        (3, _('Marzo')),
        (4, _('Abril')),
        (5, _('Mayo')),
        (6, _('Junio')),
        (7, _('Julio')),
        (8, _('Agosto')),
        (9, _('Septiembre')),
        (10, _('Octubre')),
        (11, _('Noviembre')),
        (12, _('Diciembre')),
    ]
    ANIOS = [(a, a) for a in range(2020, datetime.now().year + 1)]

    mes = forms.ChoiceField(
        choices=MESES,
        label='Mes',
        widget=forms.Select(attrs={'class': 'form-control'})
    )

    anio = forms.ChoiceField(
        choices=ANIOS,
        label='Año',
        widget=forms.Select(attrs={'class': 'form-control'})
    )

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        hoy = date.today()
        self.fields['mes'].initial = hoy.month
        self.fields['anio'].initial = hoy.year

#        self.fields['mes'].widget.attrs.update({'class': 'form-control'})
#        self.fields['anio'].widget.attrs.update({'class': 'form-control'})


class FiltroForm(forms.Form):
    #    fecha_inicio = forms.DateField(required=False, widget=forms.DateInput(attrs={'type': 'date'}))
    #    fecha_fin = forms.DateField(required=False, widget=forms.DateInput(attrs={'type': 'date'}))
    #    cuenta = forms.ModelChoiceField(queryset=Cuenta.objects.all(), required=False)
    buscar = forms.CharField(required=False, label='',
                             widget=forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Buscar...'}))


class FiltroCuentaForm(forms.Form):
    hoy = date.today()
    mes = forms.ChoiceField(
        choices=[(i, calendar.month_name[i]) for i in range(1, 13)],
        initial=hoy.month,
        required=False,
        widget=forms.Select(attrs={'class': 'form-control'})
    )
    anio = forms.ChoiceField(
        choices=[(y, y) for y in range(hoy.year - 5, hoy.year + 1)],
        initial=hoy.year,
        required=False,
        widget=forms.Select(attrs={'class': 'form-control'})
    )
    categoria = forms.ModelChoiceField(
        queryset=Categoria.objects.all(),
        required=False,
        widget=forms.Select(attrs={'class': 'form-control'})
    )


class InformeCuentaForm(forms.Form):
    cuenta = forms.ModelChoiceField(queryset=Cuenta.objects.all(), label="Cuenta")
    fecha_inicio = forms.DateField(label="Desde", widget=forms.DateInput(attrs={'type': 'date'}))
    fecha_fin = forms.DateField(label="Hasta", widget=forms.DateInput(attrs={'type': 'date'}))

    def __init__(self, *args, cuenta_id=None, **kwargs):
        super().__init__(*args, **kwargs)
        hoy = date.today()
        primero_mes = hoy.replace(day=1)

        self.fields['fecha_inicio'].initial = primero_mes
        self.fields['fecha_fin'].initial = hoy

        if cuenta_id:
            try:
                self.fields['cuenta'].initial = Cuenta.objects.get(id=cuenta_id)
            except Cuenta.DoesNotExist:
                pass  # o lanza un error si prefieres

        for field in self.fields.values():
            field.widget.attrs['class'] = 'form-control'


class FiltroInformeCuentaForm(forms.Form):
    hoy = date.today()
    desde = forms.ChoiceField(
        choices=[(i, calendar.month_name[i]) for i in range(1, 13)],
        initial=hoy.month,
        required=False,
        widget=forms.Select(attrs={'class': 'form-control'})
    )
    hasta = forms.ChoiceField(
        choices=[(y, y) for y in range(hoy.year - 5, hoy.year + 1)],
        initial=hoy.year,
        required=False,
        widget=forms.Select(attrs={'class': 'form-control'})
    )
