import { Prisma } from '@prisma/client';
import type { Request, Response } from 'express';
import prisma from '../config/db';
import { createFallbackProduct, listFallbackProducts } from '../services/inventory.store';

export const listInventory = async (_req: Request, res: Response) => {
  try {
    const products = await prisma.producto.findMany({
      orderBy: { updatedAt: 'desc' },
    });

    res.setHeader('X-Data-Source', 'database');
    return res.json(
      products.map((product) => ({
        ...product,
        updatedAt: product.updatedAt.toISOString(),
      })),
    );
  } catch (error) {
    console.warn('Database unavailable for inventory, using local fallback store.', error);
    const products = await listFallbackProducts();
    res.setHeader('X-Data-Source', 'local-fallback');
    return res.json(products);
  }
};

export const createInventoryItem = async (req: Request, res: Response) => {
  const { codigo, nombre, categoria, stockActual, stockMinimo, unidadMedida, costoUnitario } = req.body;

  if (
    typeof codigo !== 'string' ||
    typeof nombre !== 'string' ||
    typeof categoria !== 'string' ||
    typeof unidadMedida !== 'string' ||
    typeof stockActual !== 'number' ||
    typeof stockMinimo !== 'number'
  ) {
    return res.status(400).json({ error: 'Completa los campos obligatorios del producto' });
  }

  try {
    const product = await prisma.producto.create({
      data: {
        codigo: codigo.trim(),
        nombre: nombre.trim(),
        categoria: categoria.trim(),
        stockActual,
        stockMinimo,
        unidadMedida: unidadMedida.trim(),
        costoUnitario: typeof costoUnitario === 'number' ? costoUnitario : null,
      },
    });

    res.setHeader('X-Data-Source', 'database');
    return res.status(201).json({
      ...product,
      updatedAt: product.updatedAt.toISOString(),
    });
  } catch (error) {
    if (error instanceof Prisma.PrismaClientKnownRequestError && error.code === 'P2002') {
      return res.status(409).json({ error: 'Ya existe un producto con ese codigo' });
    }

    console.warn('Database unavailable while creating inventory item, using local fallback store.', error);

    try {
      const product = await createFallbackProduct({
        codigo,
        nombre,
        categoria,
        stockActual,
        stockMinimo,
        unidadMedida,
        costoUnitario,
      });

      res.setHeader('X-Data-Source', 'local-fallback');
      return res.status(201).json(product);
    } catch (fallbackError) {
      const message = fallbackError instanceof Error ? fallbackError.message : 'Error interno del servidor';
      return res.status(500).json({ error: message });
    }
  }
};
