import { NextResponse } from 'next/server';
import { prisma } from '@/lib/prisma';
import { validateOrderDates, formatDateToYYYYMMDD, calculateShipDate } from '@/lib/dateUtils';

export async function GET() {
  try {
    const [
      newOrdersCount,
      productsWithoutRecipe,
      allOrders
    ] = await Promise.all([
      prisma.order.count({ where: { status: { in: ['PENDING', 'NEW'] } } }),
      prisma.product.count({ where: { recipes: { none: {} } } }),
      prisma.order.findMany({
        orderBy: { deliveryDate: 'asc' },
        include: {
          shippingCustomer: { select: { businessName: true } },
          billingCustomer: { select: { businessName: true } },
          lines: {
            select: {
              id: true,
              quantity: true,
              product: { select: { code: true, name: true } }
            }
          }
        }
      })
    ]);

    let boxesToConfirm = 0;
    let weekendOrdersCount = 0;
    let shortLeadOrdersCount = 0;

    type AuditOrder = {
      id: string;
      po: string;
      orderNumber: string;
      customerName: string;
      creationDate: string;
      shipDate: string;
      deliveryDate: string;
      leadTimeDays: number;
      isWeekendDelivery: boolean;
      weekendDayName?: string;
      isLeadTimeUrgent: boolean;
      isLeadTimeWarning: boolean;
      status: string;
      totalBoxes: number;
      auditReasons: string[];
    };

    const auditOrders: AuditOrder[] = [];

    allOrders.forEach(o => {
      const isNew = o.status === 'PENDING' || o.status === 'NEW';
      const orderBoxes = o.lines.reduce((sum, l) => sum + (l.quantity || 1), 0);

      if (isNew) {
        boxesToConfirm += orderBoxes;
      }

      const val = validateOrderDates(o.creationDate, o.deliveryDate);

      if (val.isWeekendDelivery) {
        weekendOrdersCount++;
      }

      // Ordenes nuevas con Delivery Date <= 4 días
      if (isNew && val.isLeadTimeUrgent) {
        shortLeadOrdersCount++;
      }

      // Debe auditarse si tiene problema de fin de semana O entrega urgente <= 4 días
      if (val.isWeekendDelivery || val.isLeadTimeUrgent) {
        const customerName = o.shippingCustomer?.businessName || o.billingCustomer?.businessName || '—';
        auditOrders.push({
          id: o.id,
          po: o.po,
          orderNumber: o.orderNumber,
          customerName,
          creationDate: formatDateToYYYYMMDD(o.creationDate),
          shipDate: o.shipdt || (o.deliveryDate ? calculateShipDate(o.deliveryDate, o.service || 'FEDEX') : ''),
          deliveryDate: formatDateToYYYYMMDD(o.deliveryDate),
          leadTimeDays: val.leadTimeDays,
          isWeekendDelivery: val.isWeekendDelivery,
          weekendDayName: val.weekendDayName,
          isLeadTimeUrgent: val.isLeadTimeUrgent,
          isLeadTimeWarning: val.isLeadTimeWarning,
          status: o.status,
          totalBoxes: orderBoxes,
          auditReasons: val.warningMessages
        });
      }
    });

    // Ordenar auditOrders: fines de semana primero, luego por menor lead time
    auditOrders.sort((a, b) => {
      if (a.isWeekendDelivery && !b.isWeekendDelivery) return -1;
      if (!a.isWeekendDelivery && b.isWeekendDelivery) return 1;
      return a.leadTimeDays - b.leadTimeDays;
    });

    return NextResponse.json({
      newOrdersCount,
      boxesToConfirm,
      weekendOrdersCount,
      shortLeadOrdersCount,
      productsWithoutRecipe,
      auditOrdersCount: auditOrders.length,
      auditOrders: auditOrders.slice(0, 100) // Top 100 órdenes prioritarias para auditar
    });
  } catch (error: any) {
    console.error('Error fetching dashboard stats:', error);
    return NextResponse.json({ error: error.message || 'Failed to fetch dashboard stats' }, { status: 500 });
  }
}
