from rest_framework import viewsets, filters
from .models import Repuesto,  Ticket, RegistroEvento
from .serializers import RepuestoSerializer, TicketSerializer, RegistroEventoSerializer, ProyectoSerializer
from proyectos.models import Proyecto, SLA, UnidadDeMedida, HorarioActivo
from rest_framework.generics import ListAPIView
from .models import Ticket
from django_filters.rest_framework import DjangoFilterBackend
from .serializers import TicketResumenSerializer
# En tu archivo views.py, agregar el import faltante
from rest_framework.response import Response
from rest_framework import status
from rest_framework.exceptions import ValidationError
from rest_framework import generics
from rest_framework import viewsets, status
from rest_framework.response import Response
from rest_framework.decorators import action
import logging


import logging
logger = logging.getLogger(__name__)

class TicketViewSet(viewsets.ModelViewSet):
    queryset = Ticket.objects.all()
    serializer_class = TicketSerializer

    filter_backends = [filters.SearchFilter]
    search_fields = [
        'numero_ticket',
        'proyecto__nombre',
        'motivo',
        'equipo_modelo',
        'equipo_numero_serie',
        'tecnico_asignado__username',
    ]

    def perform_create(self, serializer):
        ticket = serializer.save()
        RegistroEvento.objects.create(
            ticket_id=ticket.id,
            status="creacion",
            usuario=self.request.user if self.request.user.is_authenticated else None
        )

    def create(self, request, *args, **kwargs):
        logger.debug("[DEBUG] POST /api/tickets/ payload: %s", request.data)

        serializer = self.get_serializer(data=request.data)
        try:
            serializer.is_valid(raise_exception=True)
        except ValidationError as e:
            logger.error("[ERROR] VALIDATION ERROR: %s", e.detail, exc_info=True)
            raise

        self.perform_create(serializer)
        logger.info("[INFO] Ticket creado con ID: %s", serializer.instance.id)
        return Response(serializer.data, status=status.HTTP_201_CREATED)

    def update(self, request, *args, **kwargs):
        instance = self.get_object()
        logger.debug("[DEBUG] PUT /api/tickets/%s/ payload: %s", instance.id, request.data)

        serializer = self.get_serializer(instance, data=request.data)
        try:
            serializer.is_valid(raise_exception=True)
        except ValidationError as e:
            logger.error("[ERROR] VALIDATION ERROR (update): %s", e.detail, exc_info=True)
            raise

        self.perform_update(serializer)
        logger.info("[INFO] Ticket actualizado con ID: %s", instance.id)
        return Response(serializer.data)


from rest_framework.parsers import MultiPartParser, FormParser, JSONParser

class RepuestoViewSet(viewsets.ModelViewSet):
    pagination_class = None
    queryset = Repuesto.objects.all()
    serializer_class = RepuestoSerializer
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ['ticket']


    def create(self, request, *args, **kwargs):
        logger.debug("CREAR Repuesto – datos recibidos: %s", request.data)
        return super().create(request, *args, **kwargs)

    def update(self, request, *args, **kwargs):
        logger.debug("UPDATE Repuesto – datos recibidos: %s", request.data)
        return super().update(request, *args, **kwargs)

    def partial_update(self, request, *args, **kwargs):
        logger.debug("PATCH Repuesto – datos recibidos: %s", request.data)
        return super().partial_update(request, *args, **kwargs)


class RegistroEventoViewSet(viewsets.ModelViewSet):
    queryset = RegistroEvento.objects.all().order_by('-fecha')
    serializer_class = RegistroEventoSerializer
    pagination_class = None
    
    def create(self, request, *args, **kwargs):
        try:
            # Convertir datos del request
            data = request.data.copy()
            data['ticket'] = int(data['ticket']) if data.get('ticket') else None
            data['usuario'] = int(data['usuario']) if data.get('usuario') else None

            serializer = self.get_serializer(data=data)
            serializer.is_valid(raise_exception=True)
            
            # Validar existencia del ticket
            if not Ticket.objects.filter(id=data['ticket']).exists():
                return Response(
                    {"error": f"Ticket ID {data['ticket']} no existe"},
                    status=status.HTTP_400_BAD_REQUEST
                )

            self.perform_create(serializer)
            headers = self.get_success_headers(serializer.data)
            
            return Response(
                serializer.data,
                status=status.HTTP_201_CREATED,
                headers=headers
            )

        except Exception as e:
            error_message = {
                "error": "Error al crear registro",
                "detalles": str(e),
                "datos_recibidos": request.data
            }
            return Response(
                error_message,
                status=status.HTTP_500_INTERNAL_SERVER_ERROR
            )
            
            
            
            
            

class proyectoViewSet(viewsets.ModelViewSet):
    queryset = Proyecto.objects.all()
    serializer_class = ProyectoSerializer
    pagination_class = None




import unicodedata
import os
import re
from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework import status
from django.core.exceptions import ValidationError




class TicketResumenListView(viewsets.ModelViewSet):
    queryset = Ticket.objects.all().order_by('-fecha_creacion')
    serializer_class = TicketResumenSerializer
    filter_backends = [filters.SearchFilter, DjangoFilterBackend]
    filterset_fields = ['ticket']
    parser_classes = [MultiPartParser, FormParser, JSONParser]
    
    # Búsqueda textual (campos reales)
    search_fields = [
    'id',
    'proyecto__clienteMandante__razonSocial',
    'proyecto__nombre',
    'motivo',
    'equipo_modelo__nombre',  
    'equipo_numero_serie',
    'tecnico_asignado__first_name',  # nombre del técnico
    'tecnico_asignado__last_name',   # apellido del técnico (opcional)
    ]

    
    # Filtros personalizados (cliente y estado)
    filterset_fields = {
        'proyecto__clienteMandante__razonSocial': ['icontains'],  # Cliente
        'eventos__status': ['exact'],  # Estado actual
        'tecnico_asignado': ['exact'],
    }

    def clean_filename(self, filename):
        name, ext = os.path.splitext(filename)
        # Quitar tildes y caracteres especiales
        name = unicodedata.normalize('NFKD', name).encode('ascii', 'ignore').decode('ascii')
        # Reemplazar espacios por guiones bajos
        name = name.replace(' ', '_')
        # Quitar cualquier carácter que no sea letra, número, guion o guion bajo
        name = re.sub(r'[^A-Za-z0-9._-]', '', name)
        return f"{name}{ext}"

    @action(detail=True, methods=['post'], parser_classes=[MultiPartParser, FormParser])
    def comentario_tecnico(self, request, pk=None):
        ticket = self.get_object()
        comentario = request.data.get('comentario_tecnico')
        archivo = request.data.get('archivo')

        try:
            ticket.comentario_tecnico = comentario

            if archivo:
                # Limpiar el nombre del archivo
                archivo.name = self.clean_filename(archivo.name)
                ticket.archivo = archivo

            ticket.save()
            return Response({'message': 'Comentario guardado exitosamente'})

        except ValidationError as e:
            return Response({'error': str(e)}, status=status.HTTP_400_BAD_REQUEST)

        except Exception as e:
            return Response(
                {'error': f'Error inesperado: {str(e)}'},
                status=status.HTTP_500_INTERNAL_SERVER_ERROR
            )

from django.http import FileResponse, Http404
import os
from django.conf import settings

def descargar_ot(request, filename):
    filepath = os.path.join(settings.MEDIA_ROOT, 'ordenes_trabajo', filename)
    if os.path.exists(filepath):
        return FileResponse(open(filepath, 'rb'), as_attachment=True, filename=filename)
    else:
        raise Http404("Archivo no encontrado")
