from rest_framework.views import APIView
from django.http import HttpResponse
from django.shortcuts import get_object_or_404
from django.db import connection
import openpyxl
from openpyxl.utils import get_column_letter
from io import BytesIO
from ticket.models import Ticket, Proyecto
from ticket.serializers import TicketResumenSerializer


class ReporteTicketAPIView(APIView):
    def get(self, request):
        proyecto_id = request.GET.get('proyecto_id')
        fecha_inicio = request.GET.get('fecha_inicio')
        fecha_fin = request.GET.get('fecha_fin')
       

        if not proyecto_id:
            return HttpResponse('proyecto_id es requerido', status=400)

        proyecto = get_object_or_404(Proyecto, id=proyecto_id)
        tickets = Ticket.objects.filter(proyecto=proyecto)
        serializer = TicketResumenSerializer(tickets, many=True)
       

        ids = tickets.values_list('id', flat=True)
      

        # Indexar datos del serializer por ID
        serializer_dict = {item['id']: item for item in serializer.data}
        todos_los_resultados = []

        with connection.cursor() as cursor:
            for ticket_id in ids:
                try:
                    cursor.execute("CALL spSlaTicket(%s)", [ticket_id])
                    resultado = cursor.fetchall()
                    columnas = [col[0] for col in cursor.description]

                    for fila in resultado:
                        fila_dict = dict(zip(columnas, fila))
                        datos_ticket = serializer_dict.get(ticket_id, {})
                        fila_combinada = {**datos_ticket, **fila_dict}
                        todos_los_resultados.append(fila_combinada)
                except ValueError as e:
                    print(f"⚠️ Error de conversión con ticket {ticket_id}: {e}")
                except Exception as e:
                    print(f"⚠️ Error general con ticket {ticket_id}: {e}")

        # Crear Excel
        wb = openpyxl.Workbook()
        ws = wb.active
        ws.title = "Reporte Ticket"
        
        if todos_los_resultados:
            columnas = list(todos_los_resultados[0].keys())

            # Columnas a excluir
            columnas_a_excluir = {'slaDetalle', 'equipoModelo2', 'historial', 'repuestos', 'horarios', 'archivo'}

            # Filtrar columnas para eliminar las no deseadas
            columnas_filtradas = [col for col in columnas if col not in columnas_a_excluir]

            # Escribir cabeceras (solo columnas filtradas)
            for col_idx, col_name in enumerate(columnas_filtradas, 1):
                ws.cell(row=1, column=col_idx, value=col_name)

            # Escribir datos (solo columnas filtradas)
            for row_idx, fila in enumerate(todos_los_resultados, 2):
                for col_idx, col_name in enumerate(columnas_filtradas, 1):
                    valor = fila.get(col_name)
                    if isinstance(valor, (dict, list)):
                        valor = str(valor)
                    ws.cell(row=row_idx, column=col_idx, value=valor)

            # Ajustar ancho de columnas
            for i, column in enumerate(columnas_filtradas, 1):
                ws.column_dimensions[get_column_letter(i)].width = 20


        # Guardar Excel en memoria
        output = BytesIO()
        wb.save(output)
        output.seek(0)

        # Preparar respuesta HTTP
        response = HttpResponse(
            output,
            content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
        )
        response['Content-Disposition'] = 'attachment; filename=reporte_ticket.xlsx'
        return response




















