from django.db import models
from django.utils import timezone
from datetime import timedelta
from proyectos.models import Proyecto, SLA, HorarioActivo
from usuarios.models import CustomUser
from django.utils.timezone import now
from mantenedorEquipos.models import Modelo, Tipo, Marca
import datetime
from django.utils.timezone import localtime, now

class Ticket(models.Model):
    TIPO_TICKET_CHOICES = [
        ('sla', 'Ticket SLA'),
        ('mantenimiento', 'Mantenimiento'),
    ]

    TIPO_CATEGORIA_CHOICES = [
        ('premium', 'Premium'),
        ('standard', 'Standard'),
    ]

    proyecto = models.ForeignKey(Proyecto, on_delete=models.CASCADE, related_name='tickets')
    sla = models.ForeignKey(SLA, on_delete=models.SET_NULL, null=True, blank=True, related_name='tickets')
    tipo_ticket = models.CharField(max_length=20, choices=TIPO_TICKET_CHOICES, default='sla')
    fecha_creacion = models.DateTimeField(auto_now_add=True)
    fecha_asignacion = models.DateTimeField(null=True, blank=True)
    tiempo_acumulado_sla = models.FloatField(default=0)  # en horas
    fecha_inicio_atencion = models.DateTimeField(null=True, blank=True)  # última vez que entró en atención
    fecha_limite = models.DateTimeField(null=True, blank=True)
   
    sla_repuesto = models.CharField(max_length=100, null=True, blank=True)
    equipo_marca = models.ForeignKey(Marca, on_delete=models.CASCADE, related_name='tickets', null=True, blank=True) #eliminar 
    equipo_tipo = models.ForeignKey(Tipo,  on_delete=models.CASCADE, related_name='tickets', null=True, blank=True) 
    equipo_modelo = models.ForeignKey(Modelo, on_delete=models.CASCADE, related_name='tickets', null=True, blank=True)
    equipo_numero_serie = models.CharField(max_length=100)
    

    #categoria_cliente = models.CharField(max_length=20, choices=TIPO_CATEGORIA_CHOICES, default='standard', blank=True, null=True)
    motivo = models.TextField()
    comentario_tecnico = models.TextField(blank=True, null=True)
    comentario_tecnico_historial = models.TextField(blank=True, null=True)
    tecnico_asignado = models.ForeignKey(
        CustomUser,
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        limit_choices_to={'tipo_usuario': 'tecnico'},
        related_name='tickets_asignados'
    )
    direccion = models.CharField(max_length=255)
    archivo = models.FileField(upload_to='ordenes_trabajo/', null=True, blank=True)

    def save(self, *args, **kwargs):
        tecnico_asignado_anterior = None
        if self.pk:
            tecnico_asignado_anterior = Ticket.objects.get(pk=self.pk).tecnico_asignado

        creando_ticket = not self.pk
        super().save(*args, **kwargs)  # Guardamos primero para tener el PK disponible

        # Si se asignó un técnico nuevo (y antes no había) o se está creando un nuevo ticket con técnico asignado
        if (tecnico_asignado_anterior is None and self.tecnico_asignado) or (creando_ticket and self.tecnico_asignado):
            if not self.eventos.filter(status='asignado').exists():
                from .models import RegistroEvento  # evitar import circular
                RegistroEvento.objects.create(
                    ticket=self,
                    status='asignado',
                    usuario=self.tecnico_asignado
                )

    @property
    def tiempo_restante(self):
        if not self.fecha_limite:
            return None
        return self.fecha_limite - now()

    @property
    def estado_actual(self):
        ultimo_evento = self.eventos.order_by('-fecha').first()
        return ultimo_evento.get_status_display() if ultimo_evento else 'Sin estado'

    def __str__(self):
        return f"Ticket #{self.id} - {self.proyecto.nombre} [{self.estado_actual}]"

    @property
    def cliente(self):
        return self.proyecto.clienteMandante
    @property
    def nombre_cliente_final(self):
        return self.proyecto.clienteFinal.nombre if self.proyecto.clienteFinal else None

    @property
    def categoria(self):
        return self.sla.categoria if self.sla else None

    @property
    def zona(self):
        return self.sla.zona if self.sla else None
    
    @property
    def estado_actual(self):
        ultimo_evento = self.eventos.order_by('-fecha').first()
        return ultimo_evento.status if ultimo_evento else None
    
    @property
    def unidad_medida(self):
        return self.sla.unidad_medida if self.sla else None
    

    @property
    def cantidad(self):
        return self.sla.cantidad if self.sla else None

    def __str__(self):
        return f"Ticket #{self.id} - {self.proyecto.nombre} [{self.estado_actual}]"
    
    @property
    def tiempo_restante_sla(self):
        total_horas = self.tiempo_acumulado_sla or 0

        # Si está en atención, suma el tiempo actual
        if self.estado_actual == 'en_atencion' and self.fecha_inicio_atencion:
            tiempo_actual = now() - self.fecha_inicio_atencion
            total_horas += tiempo_actual.total_seconds() / 3600

        horas_restantes = self.sla.cantidad - total_horas if self.sla else None
        return round(horas_restantes, 2) if horas_restantes is not None and horas_restantes > 0 else 0

    

    @property
    def horarios_proyecto(self):
        horarios = self.proyecto.horarios_activos.filter(activo=True).order_by(
            'dia'  # Ordenamos por el día de la semana
        )

        # Opcional: Si deseas convertir los días a un formato más claro o procesar las horas
        horarios_formateados = [
            {
                'dia': horario.get_dia_display(),
                'hora_inicio': horario.hora_inicio.strftime('%H:%M') if horario.hora_inicio else None,
                'hora_termino': horario.hora_termino.strftime('%H:%M') if horario.hora_termino else None
            }
            for horario in horarios
        ]
        return horarios_formateados
    
    def save(self, *args, **kwargs):
        if self.pk:
            ticket_anterior = Ticket.objects.get(pk=self.pk)
            estado_anterior = ticket_anterior.estado_actual
            ahora = now()

            # Si entra a en_atencion
            if self.estado_actual == 'en_atencion' and estado_anterior != 'en_atencion':
                self.fecha_inicio_atencion = ahora

            # Si sale de en_atencion
            elif self.estado_actual != 'en_atencion' and estado_anterior == 'en_atencion':
                if self.fecha_inicio_atencion:
                    tiempo_transcurrido = ahora - self.fecha_inicio_atencion
                    horas_transcurridas = tiempo_transcurrido.total_seconds() / 3600
                    self.tiempo_acumulado_sla += horas_transcurridas
                    self.fecha_inicio_atencion = None

        super().save(*args, **kwargs)



class Repuesto(models.Model):
    ESTADO_CHOICES = [
        ('enviado', 'Enviado'),
        ('entregado', 'Entregado'),
    ]
    codigo = models.CharField(max_length=50)
    nombre = models.CharField(max_length=100)
    cantidad = models.PositiveIntegerField()
    marca = models.ForeignKey(Marca, on_delete=models.CASCADE, related_name='repuestos', null=True, blank=True)
    disponible = models.BooleanField(default=True)
    ticket = models.ForeignKey(Ticket, on_delete=models.CASCADE, related_name='repuestos', null=True, blank=True)
    estado = models.CharField(max_length=20, choices=ESTADO_CHOICES, default='enviado', null=True, blank=True)  

    def __str__(self):
        return f"{self.nombre} ({self.codigo})"


class RegistroEvento(models.Model):
    STATUS_CHOICES = [
        ('creacion', 'Creación'),
        ('asignado', 'Asignado'),
        ('en_atencion', 'En Atención'),
        ('atendido', 'Atendido'),
        ('cerrado', 'Cerrado'),
        ('pausado', 'Pausado'),
    ]

    ticket = models.ForeignKey(Ticket, on_delete=models.CASCADE, related_name='eventos')
    status = models.CharField(max_length=20, choices=STATUS_CHOICES)
    fecha = models.DateTimeField(default=timezone.now)
    usuario = models.ForeignKey(CustomUser, on_delete=models.SET_NULL, null=True, blank=True)
   

    def __str__(self):
        return f"Ticket #{self.ticket.id} - {self.get_status_display()} en {self.fecha.strftime('%Y-%m-%d %H:%M')}"

