// --- Adaptador que carga el catálogo JSON en memoria e indexa por code ---

import { Maybe } from "@repo/rdx-utils";
import { TaxCatalogType, TaxItemType } from "./tax-catalog-types";
import { TaxCatalogProvider } from "./tax-catalog.provider";

// Si quieres habilitar la carga desde fichero en Node:
// import * as fs from "node:fs";
// import * as path from "node:path";

export class JsonTaxCatalogProvider implements TaxCatalogProvider {
  // Índice por código normalizado
  private readonly index: Map<string, TaxItemType>;

  /**
   * @param catalog Catálogo ya parseado (p.ej. import JSON o fetch)
   */
  constructor(catalog: TaxCatalogType) {
    this.index = new Map<string, TaxItemType>();
    // Normalizamos códigos a minúsculas y sin espacios
    for (const item of catalog) {
      const normalized = JsonTaxCatalogProvider.normalizeCode(item.code);
      // En caso de duplicados, el último gana (o lanza error si prefieres)
      this.index.set(normalized, item);
    }
  }

  static normalizeCode(code: string): string {
    return (code ?? "").trim().toLowerCase();
  }

  findByCode(code: string): Maybe<TaxItemType> {
    const normalized = JsonTaxCatalogProvider.normalizeCode(code);
    const found = this.index.get(normalized);
    return found ? Maybe.some(found) : Maybe.none<TaxItemType>();
  }

  // Opcional: carga desde fichero JSON en Node (descomenta si lo necesitas)
  // static fromJsonFile(filePath: string): JsonTaxCatalogProvider {
  //   const full = path.resolve(filePath);
  //   const raw = fs.readFileSync(full, "utf-8");
  //   const data = JSON.parse(raw) as TaxCatalogDto;
  //   return new JsonTaxCatalogProvider(data);
  // }
}
