import { NextResponse } from 'next/server';
import connectDB from '@/lib/mongodb';
import { PurchaseOrder, Product } from '@/models';

/**
 * GET /api/purchases/[id]
 * Retourne un bon de livraison spécifique
 */
export async function GET(
  request: Request,
  context: { params: Promise<{ id: string }> }
) {
  try {
    await connectDB();

    const { id } = await context.params;

    const order = await PurchaseOrder.findById(id)
      .populate('supplierId')
      .lean();

    if (!order) {
      return NextResponse.json(
        {
          success: false,
          error: 'Bon de livraison introuvable',
        },
        { status: 404 }
      );
    }

    return NextResponse.json({
      success: true,
      data: order,
    });
  } catch (error) {
    console.error('Erreur API Purchase GET:', error);
    return NextResponse.json(
      {
        success: false,
        error: 'Erreur lors de la récupération du bon',
      },
      { status: 500 }
    );
  }
}

/**
 * PUT /api/purchases/[id]
 * Met à jour un bon de livraison
 */
export async function PUT(
  request: Request,
  context: { params: Promise<{ id: string }> }
) {
  try {
    await connectDB();

    const { id } = await context.params;
    const body = await request.json();

    const oldOrder = await PurchaseOrder.findById(id);

    if (!oldOrder) {
      return NextResponse.json(
        {
          success: false,
          error: 'Bon de livraison introuvable',
        },
        { status: 404 }
      );
    }

    // Gérer les changements de stocks en fonction du statut et des modifications d'items
    const oldStatus = oldOrder.status;
    const newStatus = body.status || oldStatus;
    const oldItems = oldOrder.items;
    const newItems = body.items || oldItems;

    // Si le bon était RECEIVED et qu'on modifie les items, ajuster les stocks
    if (oldStatus === 'RECEIVED' && newStatus === 'RECEIVED' && body.items) {
      // Retirer les anciens stocks
      for (const item of oldItems) {
        const product = await Product.findById(item.productId);
        if (product) {
          product.currentStock = Math.max(0, (product.currentStock || 0) - item.quantity);
          await product.save();
        }
      }
      // Ajouter les nouveaux stocks
      for (const item of newItems) {
        const product = await Product.findById(item.productId);
        if (product) {
          product.currentStock = (product.currentStock || 0) + item.quantity;
          await product.save();
        }
      }
    }
    // Si on passe de PENDING à RECEIVED, mettre à jour les stocks
    else if (oldStatus === 'PENDING' && newStatus === 'RECEIVED') {
      for (const item of newItems) {
        const product = await Product.findById(item.productId);
        if (product) {
          product.currentStock = (product.currentStock || 0) + item.quantity;
          await product.save();
        }
      }
    }
    // Si on annule un ordre qui était RECEIVED, déduire les stocks
    else if (oldStatus === 'RECEIVED' && newStatus === 'CANCELLED') {
      for (const item of oldItems) {
        const product = await Product.findById(item.productId);
        if (product) {
          product.currentStock = Math.max(0, (product.currentStock || 0) - item.quantity);
          await product.save();
        }
      }
    }

    const order = await PurchaseOrder.findByIdAndUpdate(
      id,
      { $set: body },
      { new: true }
    ).populate('supplierId');

    return NextResponse.json({
      success: true,
      message: 'Bon de livraison mis à jour',
      data: order,
    });
  } catch (error) {
    console.error('Erreur API Purchase PUT:', error);
    return NextResponse.json(
      {
        success: false,
        error: 'Erreur lors de la mise à jour',
      },
      { status: 500 }
    );
  }
}

/**
 * DELETE /api/purchases/[id]
 * Supprime un bon de livraison (soft delete)
 */
export async function DELETE(
  request: Request,
  context: { params: Promise<{ id: string }> }
) {
  try {
    await connectDB();

    const { id } = await context.params;

    const order = await PurchaseOrder.findById(id);

    if (!order) {
      return NextResponse.json(
        {
          success: false,
          error: 'Bon de livraison introuvable',
        },
        { status: 404 }
      );
    }

    // Si le bon était RECEIVED, déduire les stocks
    if (order.status === 'RECEIVED') {
      for (const item of order.items) {
        const product = await Product.findById(item.productId);
        if (product) {
          product.currentStock = Math.max(0, (product.currentStock || 0) - item.quantity);
          await product.save();
        }
      }
    }

    // Marquer comme annulé au lieu de supprimer
    await PurchaseOrder.findByIdAndUpdate(id, {
      $set: { status: 'CANCELLED' },
    });

    return NextResponse.json({
      success: true,
      message: 'Bon de livraison annulé',
    });
  } catch (error) {
    console.error('Erreur API Purchase DELETE:', error);
    return NextResponse.json(
      {
        success: false,
        error: 'Erreur lors de la suppression',
      },
      { status: 500 }
    );
  }
}
