import { NextResponse } from 'next/server';
import { prisma } from '@/lib/prisma';
import { parseExcelDate } from '@/lib/dateUtils';

export async function PUT(request: Request, context: { params: Promise<{ id: string }> }) {
  try {
    const { id } = await context.params;
    const body = await request.json();
    const { agency, deliverDate, shipDate, awb, master, notes, status } = body;

    const existing = await prisma.airwayBill.findUnique({ where: { id } });
    if (!existing) {
      return NextResponse.json({ error: 'Guía no encontrada' }, { status: 404 });
    }

    // If already archived and request is not unarchiving it, protect from direct edits
    if (existing.status === 'ARCHIVED' && status !== 'ACTIVE' && (agency || deliverDate || shipDate || awb || master)) {
      return NextResponse.json({
        error: 'Una guía archivada está protegida para preservar el historial de órdenes pasadas. Debe desarchivarla primero si necesita modificar sus datos.'
      }, { status: 400 });
    }

    const dataToUpdate: any = {};
    if (agency !== undefined) dataToUpdate.agency = agency.trim().toUpperCase();
    if (deliverDate !== undefined) dataToUpdate.deliverDate = parseExcelDate(deliverDate);
    if (shipDate !== undefined) dataToUpdate.shipDate = parseExcelDate(shipDate);
    if (awb !== undefined) {
      dataToUpdate.awb = awb.trim();
      if (!master) {
        const digitsOnly = dataToUpdate.awb.replace(/\D/g, '');
        dataToUpdate.master = digitsOnly.length >= 4 ? digitsOnly.slice(-4) : dataToUpdate.awb.slice(-4);
      }
    }
    if (master !== undefined && master.trim()) dataToUpdate.master = master.trim();
    if (notes !== undefined) dataToUpdate.notes = notes;
    if (status !== undefined) dataToUpdate.status = status;

    const updated = await prisma.airwayBill.update({
      where: { id },
      data: dataToUpdate
    });

    return NextResponse.json(updated);
  } catch (error: any) {
    return NextResponse.json({ error: error.message || 'Error updating guía' }, { status: 500 });
  }
}

export async function DELETE(request: Request, context: { params: Promise<{ id: string }> }) {
  try {
    const { id } = await context.params;
    const guia = await prisma.airwayBill.findUnique({ where: { id } });
    if (!guia) {
      return NextResponse.json({ error: 'Guía no encontrada' }, { status: 404 });
    }

    if (guia.status === 'ARCHIVED') {
      return NextResponse.json({
        error: 'Las guías archivadas no se pueden eliminar porque preservan la información histórica de órdenes pasadas.'
      }, { status: 400 });
    }

    // Check if used in any order lines
    const usedInOrder = await prisma.orderLine.findFirst({
      where: { airwayBill: guia.awb }
    });
    if (usedInOrder) {
      return NextResponse.json({
        error: 'No se puede eliminar esta guía porque ya está asociada a cajas de órdenes procesadas. Debe archivarla para retirarla de la vista activa.'
      }, { status: 400 });
    }

    await prisma.airwayBill.delete({ where: { id } });
    return NextResponse.json({ success: true });
  } catch (error: any) {
    return NextResponse.json({ error: error.message || 'Error deleting guía' }, { status: 500 });
  }
}
