from django.db import models
from reymotausers.models import ReyMotaUser
from decimal import Decimal


class Cuenta(models.Model):
    TIPO_CUENTA_CHOICES = (
        ('ingreso', 'Ingreso'),
        ('gasto', 'Gasto'),
    )
    nombre = models.CharField(max_length=100)
    tipo = models.CharField(max_length=10, choices=TIPO_CUENTA_CHOICES)
    saldo = models.DecimalField(max_digits=10, decimal_places=2, default=0.0)
    usuario = models.ForeignKey(ReyMotaUser, on_delete=models.CASCADE)
    favorita = models.BooleanField(default=False)

    saldo_inicial = models.DecimalField(
        max_digits=12, decimal_places=2, default=Decimal("0.00")
    )

    def __str__(self):
        return f"{self.nombre} ({self.tipo})"


class Categoria(models.Model):
    nombre = models.CharField(max_length=100)

    def __str__(self):
        return self.nombre


class Movimiento(models.Model):
    usuario = models.ForeignKey(ReyMotaUser, on_delete=models.CASCADE)
    cuenta_origen = models.ForeignKey(Cuenta, on_delete=models.CASCADE, related_name='movimientos_salida', default=1)
    cuenta_destino = models.ForeignKey(Cuenta, on_delete=models.CASCADE, related_name='movimientos_entrada', default=1)
    monto = models.DecimalField(max_digits=10, decimal_places=2)
    fecha = models.DateTimeField()
    descripcion = models.TextField(blank=True, null=True)
    categoria = models.ForeignKey(Categoria, on_delete=models.SET_NULL, null=True, blank=True)

    def __str__(self):
        return f"{self.cuenta_origen.nombre} → {self.cuenta_destino.nombre} - {self.monto} ({self.fecha})"


class MovimientoFrecuente(models.Model):
    nombre = models.CharField(max_length=100)
    usuario = models.ForeignKey(ReyMotaUser, on_delete=models.CASCADE)
    cuenta_origen = models.ForeignKey(Cuenta, on_delete=models.CASCADE, related_name='frecuente_origen')
    cuenta_destino = models.ForeignKey(Cuenta, on_delete=models.CASCADE, related_name='frecuente_destino')
    categoria = models.ForeignKey(Categoria, on_delete=models.SET_NULL, null=True, blank=True)
    descripcion = models.TextField(blank=True, null=True)
    monto = models.DecimalField(max_digits=10, decimal_places=2)

    def __str__(self):
        return f"{self.nombre}: {self.cuenta_origen} → {self.cuenta_destino} ({self.monto} €)"


class TransaccionRecurrente(models.Model):
    FRECUENCIA_CHOICES = [
        ('mensual_dia', 'Día fijo del mes'),
        ('mensual_semana', 'Primer día específico de la semana del mes'),
    ]

    usuario = models.ForeignKey(ReyMotaUser, on_delete=models.CASCADE)
    cuenta_origen = models.ForeignKey(Cuenta, on_delete=models.CASCADE, related_name='recurrente_salida')
    cuenta_destino = models.ForeignKey(Cuenta, on_delete=models.CASCADE, related_name='recurrente_entrada')
    monto = models.DecimalField(max_digits=10, decimal_places=2)
    categoria = models.ForeignKey(Categoria, on_delete=models.SET_NULL, null=True, blank=True)
    descripcion = models.TextField(blank=True, null=True)
    frecuencia = models.CharField(max_length=20, choices=FRECUENCIA_CHOICES)

    # Para frecuencia tipo mensual_dia
    dia_del_mes = models.PositiveIntegerField(null=True, blank=True)  # 1-31

    # Para frecuencia tipo mensual_semana
    dia_semana = models.PositiveIntegerField(null=True, blank=True)  # 0=lunes ... 6=domingo
    semana = models.PositiveIntegerField(null=True, blank=True)      # 1=primera, 2=segunda, etc.

    activa = models.BooleanField(default=True)
    ultima_ejecucion = models.DateField(null=True, blank=True)

    def __str__(self):
        if self.semana:
            return f"{self.descripcion or 'Recurrente'}: {self.monto} € cada mes el día {self.dia_del_mes} o el {self.semana}º {self.dia_semana} de la semana"
        else:
            return f"{self.descripcion or 'Recurrente'}: {self.monto} € cada mes el día {self.dia_del_mes}"
