import { NextRequest, NextResponse } from 'next/server'
import { db } from '@/lib/db'

// GET /api/produits - Get all products with filters
export async function GET(request: NextRequest) {
  try {
    const searchParams = request.nextUrl.searchParams
    const search = searchParams.get('search')
    const categorie = searchParams.get('categorie')
    const stockStatus = searchParams.get('stockStatus')
    const actif = searchParams.get('actif')

    const where: any = {}

    if (search) {
      where.OR = [
        { reference: { contains: search, mode: 'insensitive' } },
        { designation: { contains: search, mode: 'insensitive' } },
        { marque: { contains: search, mode: 'insensitive' } },
        { codeBarre: { contains: search, mode: 'insensitive' } },
      ]
    }

    if (categorie && categorie !== 'all') {
      where.categorie = categorie
    }

    if (actif !== null && actif !== 'all') {
      where.actif = actif === 'true'
    }

    let produits = await db.produit.findMany({
      where,
      include: {
        fournisseur: {
          select: {
            id: true,
            nom: true,
          },
        },
        fichiers: {
          where: {
            type: 'IMAGE_PRODUIT',
          },
        },
      },
      orderBy: {
        createdAt: 'desc',
      },
    })

    // Apply stock status filter (client-side for complex logic)
    if (stockStatus && stockStatus !== 'all') {
      produits = produits.filter((produit) => {
        if (stockStatus === 'low') return produit.stock < produit.stockMin
        if (stockStatus === 'ok') return produit.stock >= produit.stockMin
        if (stockStatus === 'out') return produit.stock <= 0
        return true
      })
    }

    // Transform data to match frontend expectations
    const transformedProduits = produits.map((produit) => ({
      ...produit,
      fournisseurNom: produit.fournisseur?.nom || null,
      fournisseurId: produit.fournisseur?.id || null,
      images: produit.fichiers || [],
    }))

    return NextResponse.json(transformedProduits)
  } catch (error) {
    console.error('Error fetching produits:', error)
    return NextResponse.json(
      { error: 'Failed to fetch products' },
      { status: 500 }
    )
  }
}

// POST /api/produits - Create a new product
export async function POST(request: NextRequest) {
  try {
    const body = await request.json()

    // Validate required fields
    if (!body.reference || !body.designation || !body.categorie) {
      return NextResponse.json(
        { error: 'Missing required fields: reference, designation, categorie' },
        { status: 400 }
      )
    }

    // Check if reference already exists
    const existingProduit = await db.produit.findUnique({
      where: { reference: body.reference },
    })

    if (existingProduit) {
      return NextResponse.json(
        { error: 'Un produit avec cette référence existe déjà' },
        { status: 400 }
      )
    }

    // Check if barcode already exists (if provided)
    if (body.codeBarre) {
      const existingBarcode = await db.produit.findUnique({
        where: { codeBarre: body.codeBarre },
      })

      if (existingBarcode) {
        return NextResponse.json(
          { error: 'Un produit avec ce code-barres existe déjà' },
          { status: 400 }
        )
      }
    }

    const produit = await db.produit.create({
      data: {
        reference: body.reference,
        designation: body.designation,
        categorie: body.categorie,
        fournisseurId: body.fournisseurId || null,
        prixAchatHT: parseFloat(body.prixAchatHT) || 0,
        prixVenteTTC: parseFloat(body.prixVenteTTC) || 0,
        tva: parseFloat(body.tva) || 20,
        stock: parseInt(body.stock) || 0,
        stockMin: parseInt(body.stockMin) || 5,
        emplacement: body.emplacement || null,
        marque: body.marque || null,
        typeMonture: body.typeMonture || null,
        typeVerre: body.typeVerre || null,
        indice: body.indice ? parseFloat(body.indice) : null,
        materiau: body.materiau || null,
        couleur: body.couleur || null,
        dimensions: body.dimensions || null,
        description: body.description || null,
        codeBarre: body.codeBarre || null,
        actif: body.actif !== undefined ? body.actif : true,
      },
      include: {
        fournisseur: {
          select: {
            id: true,
            nom: true,
          },
        },
      },
    })

    return NextResponse.json({
      ...produit,
      fournisseurNom: produit.fournisseur?.nom || null,
      fournisseurId: produit.fournisseur?.id || null,
    })
  } catch (error) {
    console.error('Error creating produit:', error)
    return NextResponse.json(
      { error: 'Failed to create product' },
      { status: 500 }
    )
  }
}
