from django.db import models


class Url(models.Model):
    TIPO_CHOICES = [
        ('informe', 'Informe'),
        ('datamart', 'Datamart'),
    ]

    nombre = models.CharField(max_length=250)
    # 🌟 CORRECCIÓN 1: URLField para validación automática de formato (requiere http/https)
    url = models.URLField(max_length=250)
    area = models.ForeignKey(
        'login.Area',
        on_delete=models.CASCADE,
        # 🌟 OPTIMIZACIÓN: Se eliminó db_column='area'. Django usará la columna 'area_id'.
        related_name='urls'
    )
    descrip = models.TextField(null=True, blank=True)
    img_descrip = models.TextField(null=True, blank=True)
    tipo = models.CharField(
        max_length=20,
        choices=TIPO_CHOICES,
        null=True,
        blank=True
    )
    fecha_creacion = models.DateTimeField(auto_now_add=True)

    class Meta:
        db_table = 'url'
        verbose_name = "URL"
        verbose_name_plural = "URLs"
        indexes = [
            models.Index(fields=['area'], name='url_area_idx'),
        ]

    def __str__(self):
        return self.nombre


class Solicitud(models.Model):
    ESTADO_CHOICES = [
        (0, 'Rechazada'),
        (1, 'Aprobada'),
        (2, 'Pendiente'),
    ]

    usuario = models.ForeignKey(
        'login.Usuario',
        on_delete=models.CASCADE,
        # 🌟 OPTIMIZACIÓN: Se eliminó db_column='usuario'. Django usará 'usuario_id'.
        related_name='solicitudes'
    )
    # Nota: Aquí se mantienen 'solicitud_area' y 'solicitud_url' aunque podrían ser redundantes.
    # Si una solicitud es SÓLO para una URL, podrías eliminar solicitud_area.
    solicitud_area = models.ForeignKey(
        'login.Area',
        on_delete=models.CASCADE,
        # 🌟 OPTIMIZACIÓN: Se eliminó db_column='solicitud_area'. Django usará 'solicitud_area_id'.
        related_name='solicitudes_area'
    )
    solicitud_url = models.ForeignKey(
        'Url',
        on_delete=models.CASCADE,
        # 🌟 OPTIMIZACIÓN: Se eliminó db_column='solicitud_url'. Django usará 'solicitud_url_id'.
        related_name='solicitudes_url'
    )
    justificacion = models.TextField(null=True, blank=True)
    estado = models.IntegerField(
        choices=ESTADO_CHOICES,
        default=2
    )

    class Meta:
        db_table = 'solicitudes'
        verbose_name = "Solicitud"
        verbose_name_plural = "Solicitudes"
        indexes = [
            models.Index(fields=['usuario'], name='solicitud_usuario_idx'),
            models.Index(fields=['solicitud_area'], name='solicitud_area_idx'),
            models.Index(fields=['solicitud_url'], name='solicitud_url_idx'),
        ]

    def __str__(self):
        # Asegúrate de que el modelo Usuario tenga un campo 'nombre' o ajusta esta línea.
        return f"Solicitud #{self.id} - {self.usuario}"


class PermisoArea(models.Model):
    usuario = models.ForeignKey(
        'login.Usuario',
        on_delete=models.CASCADE,
        # 🌟 OPTIMIZACIÓN: Se eliminó db_column='usuario'. Django usará 'usuario_id'.
        related_name='permisos_area'
    )
    area = models.ForeignKey(
        'login.Area',
        on_delete=models.CASCADE,
        # 🌟 OPTIMIZACIÓN: Se eliminó db_column='area'. Django usará 'area_id'.
        related_name='permisos_area'
    )
    # Considera usar choices si el 0 representa un estado específico (ej. 0=Inactivo, 1=Activo)
    estado = models.IntegerField(default=0)

    class Meta:
        db_table = 'permisoarea'
        verbose_name = "Permiso de Área"
        verbose_name_plural = "Permisos de Áreas"
        indexes = [
            models.Index(fields=['usuario'], name='permisoarea_usuario_idx'),
            models.Index(fields=['area'], name='permisoarea_area_idx'),
        ]
        # Una clave única compuesta es a menudo útil aquí:
        unique_together = ('usuario', 'area')

    def __str__(self):
        # Asegúrate de que el modelo Usuario y Area tengan un campo 'nombre' o ajusta esta línea.
        return f"Permiso de {self.usuario} para {self.area}"


class PermisoUrl(models.Model):
    usuario = models.ForeignKey(
        'login.Usuario',
        on_delete=models.CASCADE,
        # 🌟 OPTIMIZACIÓN: Se eliminó db_column='usuario'. Django usará 'usuario_id'.
        related_name='permisos_url'
    )
    url = models.ForeignKey(
        'Url',
        on_delete=models.CASCADE,
        # 🌟 OPTIMIZACIÓN: Se eliminó db_column='url'. Django usará 'url_id'.
        related_name='permisos_url'
    )
    # Considera usar choices si el 0 representa un estado específico (ej. 0=Inactivo, 1=Activo)
    estado = models.IntegerField(default=0)

    class Meta:
        db_table = 'permisourl'
        verbose_name = "Permiso de URL"
        verbose_name_plural = "Permisos de URLs"
        indexes = [
            models.Index(fields=['usuario'], name='permisourl_usuario_idx'),
            models.Index(fields=['url'], name='permisourl_url_idx'),
        ]
        # Una clave única compuesta es a menudo útil aquí:
        unique_together = ('usuario', 'url')

    def __str__(self):
        # Asegúrate de que el modelo Usuario y Url tengan un campo 'nombre' o ajusta esta línea.
        return f"Permiso de {self.usuario} para {self.url}"