import { randomUUID } from 'crypto';
import { readDataFile, writeDataFile } from './local-store';

export type StoredProduct = {
  id: string;
  codigo: string;
  nombre: string;
  categoria: string;
  stockActual: number;
  stockMinimo: number;
  unidadMedida: string;
  costoUnitario: number | null;
  activo: boolean;
  updatedAt: string;
};

type CreateFallbackProductInput = {
  codigo: string;
  nombre: string;
  categoria: string;
  stockActual: number;
  stockMinimo: number;
  unidadMedida: string;
  costoUnitario?: number | null;
};

const fileName = 'inventory.json';

const defaultProducts = (): StoredProduct[] => {
  const now = new Date().toISOString();

  return [
    {
      id: randomUUID(),
      codigo: 'INV-001',
      nombre: 'Resina A2',
      categoria: 'Restauracion',
      stockActual: 2,
      stockMinimo: 5,
      unidadMedida: 'unidad',
      costoUnitario: 35,
      activo: true,
      updatedAt: now,
    },
    {
      id: randomUUID(),
      codigo: 'INV-002',
      nombre: 'Guantes de latex',
      categoria: 'Bioseguridad',
      stockActual: 14,
      stockMinimo: 8,
      unidadMedida: 'caja',
      costoUnitario: 22,
      activo: true,
      updatedAt: now,
    },
  ];
};

export const listFallbackProducts = async () =>
  readDataFile<StoredProduct[]>(fileName, defaultProducts);

export const createFallbackProduct = async (input: CreateFallbackProductInput) => {
  const products = await listFallbackProducts();

  if (products.some((product) => product.codigo.toLowerCase() === input.codigo.trim().toLowerCase())) {
    throw new Error('Ya existe un producto con ese codigo');
  }

  const product: StoredProduct = {
    id: randomUUID(),
    codigo: input.codigo.trim(),
    nombre: input.nombre.trim(),
    categoria: input.categoria.trim(),
    stockActual: input.stockActual,
    stockMinimo: input.stockMinimo,
    unidadMedida: input.unidadMedida.trim(),
    costoUnitario: input.costoUnitario ?? null,
    activo: true,
    updatedAt: new Date().toISOString(),
  };

  products.unshift(product);
  await writeDataFile(fileName, products);
  return product;
};
