from django.db import models
from django.conf import settings
from django.utils import timezone
from gestion_usuarios.models import Usuario

# --- MODELOS AUXILIARES ---

class Departamento(models.Model):
    nombre = models.CharField(max_length=100, unique=True)
    descripcion = models.TextField(blank=True, null=True)

    def __str__(self):
        return self.nombre

class Ubicacion(models.Model):
    nombre = models.CharField(max_length=100, unique=True)
    descripcion = models.TextField(blank=True, null=True)

    def __str__(self):
        return self.nombre

class CategoriaEquipo(models.Model):
    nombre = models.CharField(max_length=100, unique=True)
    descripcion = models.TextField(blank=True, null=True)

    def __str__(self):
        return self.nombre

# --- MANAGER PERSONALIZADO ---

class EquipoManager(models.Manager):
    """Manager para filtrar por defecto solo los equipos activos."""
    def get_queryset(self):
        return super().get_queryset().filter(activo=True)

# --- MODELO PRINCIPAL: EQUIPO ---

class Equipo(models.Model):
    ESTADO_CHOICES = [
        ('DI', 'Disponible'),
        ('AS', 'Asignado'),
        ('mantenimiento', 'Mantenimiento'),
        ('danado', 'Dañado'),
        ('baja', 'Dado de Baja'),
        ('prestamo', 'Prestamo'),
    ]

    # Datos generales y de gestión
    numero_serie = models.CharField(max_length=100, unique=True, verbose_name="Número de Serie")
    nombre = models.CharField(max_length=100, verbose_name="Nombre del Equipo (Ej: PC-Contabilidad-01)")
    estado = models.CharField(max_length=20, choices=ESTADO_CHOICES, default='DI')
    fecha_adquisicion = models.DateField(blank=True, null=True)
    notas = models.TextField(blank=True, null=True)

    # Relaciones
    categoria = models.ForeignKey(CategoriaEquipo, on_delete=models.SET_NULL, null=True, blank=True)
    Ubicacion = models.ForeignKey(Ubicacion, on_delete=models.SET_NULL, null=True, blank=True)

    # Especificaciones de hardware
    marca = models.CharField(max_length=100, blank=True, null=True)
    modelo = models.CharField(max_length=100, blank=True, null=True)
    disco_duro_tipo = models.CharField(max_length=50, blank=True, null=True, verbose_name="Tipo de Disco Duro (SSD, HDD)")
    disco_duro_capacidad_gb = models.PositiveIntegerField(blank=True, null=True, verbose_name="Capacidad del Disco (GB)")
    procesador_marca = models.CharField(max_length=100, blank=True, null=True, verbose_name="Marca del Procesador (Intel, AMD)")
    procesador_tipo = models.CharField(max_length=100, blank=True, null=True, verbose_name="Tipo de Procesador (Core i5, Ryzen 7)")
    procesador_velocidad_ghz = models.DecimalField(max_digits=4, decimal_places=2, blank=True, null=True, verbose_name="Velocidad del Procesador (GHz)")
    ram_cantidad_gb = models.PositiveIntegerField(blank=True, null=True, verbose_name="Cantidad de RAM (GB)")
    ram_tipo = models.CharField(max_length=50, blank=True, null=True, verbose_name="Tipo de RAM (DDR4, DDR5)")

    # Periféricos asociados
    teclado_marca = models.CharField(max_length=100, blank=True, null=True, verbose_name="Marca del Teclado")
    teclado_serial = models.CharField(max_length=100, blank=True, null=True, verbose_name="Serial del Teclado")
    mouse_marca = models.CharField(max_length=100, blank=True, null=True, verbose_name="Marca del Mouse")
    mouse_serial = models.CharField(max_length=100, blank=True, null=True, verbose_name="Serial del Mouse")
    monitor_marca = models.CharField(max_length=100, blank=True, null=True, verbose_name="Marca del Monitor")
    monitor_modelo = models.CharField(max_length=100, blank=True, null=True, verbose_name="Modelo del Monitor")
    monitor_serial = models.CharField(max_length=100, blank=True, null=True, verbose_name="Serial del Monitor")

    # Facturas y garantías
    factura = models.FileField(upload_to='facturas/', blank=True, null=True)
    garantia_fin = models.DateField(blank=True, null=True, verbose_name="Fecha de Fin de Garantía")

    # Borrado lógico
    activo = models.BooleanField(default=True, editable=False)

    # Managers
    objects = EquipoManager()  # Solo equipos activos
    all_objects = models.Manager()  # Todos los equipos

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

    def delete(self, force_delete=False, *args, **kwargs):
        if force_delete:
            return super().delete(*args, **kwargs)
        self.asignaciones.filter(activa=True).update(
            activa=False,
            fecha_devolucion=timezone.now()
        )
        self.activo = False
        self.estado = 'baja'
        self.save()

# --- MANTENIMIENTO ---

class Mantenimiento(models.Model):
    equipo = models.ForeignKey(Equipo, on_delete=models.CASCADE)
    tecnico = models.CharField(max_length=100, null=True, blank=True)
    fecha_mantenimiento = models.DateField()
    tipo_mantenimiento = models.CharField(max_length=100)
    descripcion = models.TextField(blank=True, null=True)
    costo = models.DecimalField(max_digits=10, decimal_places=2, blank=True, null=True)

    def __str__(self):
        return f"Mantenimiento de {self.equipo} el {self.fecha_mantenimiento}"

# --- ASIGNACIÓN DE EQUIPOS ---

class Asignacion(models.Model):
    equipo = models.ForeignKey(
        Equipo,
        on_delete=models.CASCADE,
        related_name='asignaciones'
    )
    usuario = models.ForeignKey(
        Usuario,
        on_delete=models.CASCADE,
        related_name='asignaciones'
    )
    fecha_asignacion = models.DateTimeField(auto_now_add=True)
    fecha_devolucion = models.DateTimeField(null=True, blank=True)
    activa = models.BooleanField(default=True)
    notas = models.TextField(blank=True, null=True)
    fecha_entrega_prevista = models.DateField(
        blank=True,
        null=True,
        verbose_name="Fecha de Entrega Prevista"
    )

    def __str__(self):
        estado = "Activa" if self.activa else "Histórica"
        return f"{self.equipo.nombre} a {self.usuario.nombre} ({estado})"

# --- HISTORIAL DE MOVIMIENTOS ---

class HistorialMovimiento(models.Model):
    """
    Guarda un registro de cada acción importante realizada en el sistema.
    """
    usuario = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.SET_NULL,
        null=True,
        blank=True
    )
    accion = models.CharField(max_length=255)
    fecha = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        user_display = self.usuario.username if self.usuario else "Sistema"
        return f"{self.fecha.strftime('%Y-%m-%d %H:%M')} - {user_display} - {self.accion}"

    class Meta:
        ordering = ['-fecha']
        
# --- ACTA CONSOLIDADA ---

class ActaConsolidadaManager(models.Manager):
    def get_queryset(self):
        return super().get_queryset().filter(activa=True)
    
class ActaConsolidada(models.Model):
    
    usuario = models.ForeignKey(Usuario, on_delete=models.CASCADE, related_name='actas_consolidadas')
    identificador = models.CharField(max_length=100, unique=True)
    archivo_generado = models.FileField(upload_to='actas_generadas/', verbose_name="Acta Generada (PDF)")
    archivo_firmado = models.FileField(upload_to='actas_firmadas/', blank=True, null=True, verbose_name="Acta Firmada (PDF)")
    fecha_generacion = models.DateTimeField(auto_now_add=True)
    
    activa = models.BooleanField(default=True, editable=False)
    objects = ActaConsolidadaManager() 
    all_objects = models.Manager() 

    def __str__(self):
        return self.identificador
    def delete(self, force_delete=False, *args, **kwargs):
        if force_delete:
            return super().delete(*args, **kwargs)
        self.activa = False
        self.save()