from rest_framework import serializers
from .models import Repuesto, Ticket, RegistroEvento
from usuarios.models import CustomUser  
from proyectos.models import Proyecto, SLA, UnidadDeMedida, HorarioActivo
from mantenedorEquipos.models import Marca, Modelo
from django.utils.timezone import localtime

class UnidadDeMedidaSerializer(serializers.ModelSerializer):
    proyecto = serializers.PrimaryKeyRelatedField(queryset=Proyecto.objects.all())
    
    class Meta:
        model = UnidadDeMedida
        fields = '__all__'

class SLASerializer(serializers.ModelSerializer):
    unidad_medida = UnidadDeMedidaSerializer(read_only=True)
    class Meta:
        model = SLA
        fields = '__all__'

class MarcaSerializer(serializers.ModelSerializer):
    class Meta:
        model = Marca
        fields = '__all__'

class RepuestoSerializer(serializers.ModelSerializer):
    marca_nombre = serializers.CharField(source='marca.nombre', read_only=True)  # Agrega este campo
    class Meta:
        model = Repuesto
        fields = '__all__'

class RegistroEventoSerializer(serializers.ModelSerializer):
    fecha = serializers.DateTimeField(format='%Y-%m-%d %H:%M:%S', read_only=True)
    ticket = serializers.PrimaryKeyRelatedField(queryset=Ticket.objects.all(), write_only=True)
    usuario = serializers.PrimaryKeyRelatedField(queryset=Ticket.objects.all(), write_only=True)
    class Meta:
        model = RegistroEvento
        fields = '__all__'

class TicketSerializer(serializers.ModelSerializer):
    class Meta:
        model = Ticket
        fields = '__all__'
        extra_kwargs = {
            'proyecto': {'write_only': True},  # Opcional: para evitar mostrar datos anidados
            'tecnico_asignado': {'write_only': True}
        }
        


class ProyectoSerializer(serializers.ModelSerializer):
    resumen = serializers.SerializerMethodField()

    class Meta:
        model = Proyecto
        fields = ['id', 'nombre', 'resumen']

    def get_resumen(self, obj):
        return [
            {
                "id": sla.id,  # Está incluido pero puedes ocultarlo en frontend
                "texto": f"{sla.categoria} {sla.zona} {sla.cantidad} {sla.unidad_medida.nombre}"
            }
            for sla in obj.slas.all()
        ]

class EquipoModeloSerializer(serializers.ModelSerializer):
    class Meta:
        model = Modelo  # Ajusta al nombre real de tu modelo
        fields = '__all__'


from datetime import datetime, time
class TicketResumenSerializer(serializers.ModelSerializer):
   
    idcliente = serializers.CharField(source='cliente.id', default=None)
    mandanteNombre = serializers.CharField(source='cliente.razonSocial', default=None)
    proyectoId = serializers.CharField(source='proyecto.id', default=None)
    proyectoNombre = serializers.CharField(source='proyecto.nombre', default=None)

    numeroSerie = serializers.CharField(source='equipo_numero_serie', default=None)
    equipoMarca = serializers.CharField(source='equipo_marca.nombre', allow_null=True,  default=None)
    equipoTipo = serializers.CharField(source='equipo_tipo.nombre',  allow_null=True, default=None)
    equipoModelo2 = EquipoModeloSerializer(source='equipo_modelo', read_only=True)
    equipoModelo = serializers.CharField(source='equipo_modelo.nombre', allow_null=True, default=None)

    tipoTicket = serializers.CharField(source='tipo_ticket', default=None)
    motivo = serializers.CharField(default=None)

    zona = serializers.CharField(source='sla.zona.nombre', default=None)
    slaCantidad = serializers.CharField(source='sla.cantidad', default=None)
    slaDetalle = SLASerializer(source='sla', read_only=True)
    slaRepuesto = serializers.CharField(source='sla_repuesto', default=None)
    estado = serializers.CharField(source='estado_actual')
    direccion = serializers.CharField(default=None)
    fechaCreacion = serializers.DateTimeField(source='fecha_creacion', format='%Y-%m-%d')

    tecnicoAsignado = serializers.CharField(source='tecnico_asignado.get_full_name', default=None)
    repuestos = RepuestoSerializer(many=True, read_only=True)
    horarios = serializers.SerializerMethodField()
    historial = RegistroEventoSerializer(source='eventos', many=True, read_only=True)

    fechaAsignacion = serializers.SerializerMethodField()
    fechaCierre = serializers.SerializerMethodField()

    class Meta:
        model = Ticket
        fields = [
            'id',  'idcliente', 'mandanteNombre', 'proyectoId', 'proyectoNombre',
            'numeroSerie', 'tipoTicket', 'motivo', 'equipoMarca', 'equipoTipo', 'equipoModelo', 'equipoModelo2','numeroSerie',
            'zona', 'slaCantidad', 'slaDetalle','slaRepuesto', 'direccion', 'estado', 'fechaCreacion', 'tecnicoAsignado',
            'repuestos', 'horarios', 'historial', 'comentario_tecnico_historial', 'comentario_tecnico', 'archivo','fechaAsignacion','fechaCierre'
        ]

    def get_estado_actual(self, obj):
        return obj.estado_actual
    
    def get_tecnico_asignado_nombre(self, obj):
        return obj.tecnico_asignado.get_full_name() if obj.tecnico_asignado else None

    def get_proyecto_nombre(self, obj):
        return obj.proyecto.nombre if obj.proyecto else None
    

    def get_cliente_final_nombre(self, obj):
        return obj.proyecto.clienteFinal.razonSocial if obj.proyecto and obj.proyecto.clienteFinal else None
    
    def get_horarios(self, obj):
        return obj.horarios_proyecto
    
    def get_fechaAsignacion(self, obj):
        evento = obj.eventos.filter(status='asignado').order_by('fecha').first()
        return evento.fecha.strftime('%Y-%m-%d %H:%M:%S') if evento else None

    def get_fechaCierre(self, obj):
        evento = obj.eventos.filter(status='cerrado').order_by('fecha').first()
        return evento.fecha.strftime('%Y-%m-%d %H:%M:%S') if evento else None
      

# ticket/serializers.py
from rest_framework import serializers
from .models import RegistroEvento


class RegistroEventoSerializer(serializers.ModelSerializer):
    ticket = serializers.PrimaryKeyRelatedField(
        queryset=Ticket.objects.all(),
        error_messages={'does_not_exist': 'Ticket ID {pk_value} no existe'}
    )
    usuario = serializers.PrimaryKeyRelatedField(
        queryset=CustomUser.objects.all(),
        allow_null=True,
        required=False
    )

    class Meta:
        model = RegistroEvento
        fields = '__all__'