import { productosApi } from './api';
import { db } from './db';

export type ProductoSearchOptions = {
  esServicio?: boolean;
  soloTaller?: boolean;
};

function mapProducto(producto: any) {
  const origen: 'local' | 'erp' = producto?.origen === 'local' ? 'local' : 'erp';

  return {
    plu: String(producto?.plu || ''),
    desclarga: String(producto?.desclarga || producto?.descripcion || ''),
    desccorta: producto?.desccorta || undefined,
    precio: Number(producto?.precio || 0),
    iva: Number(producto?.iva || 0),
    pagaiva: Boolean(producto?.pagaiva),
    tipo: String(producto?.tipo || ''),
    es_servicio: Boolean(producto?.es_servicio || producto?.esServicio),
    usainventario: producto?.usainventario === undefined ? true : Boolean(producto?.usainventario),
    estaller: producto?.estaller === undefined ? true : Boolean(producto?.estaller),
    origen,
    cachedAt: Date.now(),
  };
}

export async function cacheRemoteProductos(productos: any[]): Promise<void> {
  const rows = (productos || []).map(mapProducto).filter((producto) => producto.plu && producto.desclarga);
  if (rows.length === 0) return;
  await db.productos.bulkPut(rows);
}

export async function syncTopProductos(limit = 200, options: ProductoSearchOptions = {}): Promise<void> {
  const remote = await productosApi.getTop(limit, options);
  await cacheRemoteProductos(remote || []);
}

export async function searchLocalProductos(
  query: string,
  limit = 12,
  options: ProductoSearchOptions = {},
): Promise<any[]> {
  const term = query.trim().toLowerCase();
  const rows = await db.productos.toArray();

  return rows
    .filter((producto) => {
      if (options.esServicio !== undefined && Boolean(producto.es_servicio) !== options.esServicio) {
        return false;
      }

      if (options.soloTaller && producto.estaller === false) {
        return false;
      }

      if (!term) return true;
      const composite = `${producto.plu} ${producto.desclarga} ${producto.desccorta || ''}`.toLowerCase();
      return composite.includes(term);
    })
    .sort((a, b) => a.desclarga.localeCompare(b.desclarga))
    .slice(0, limit);
}
