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

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

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

  /**
   * @param catalog Catálogo ya parseado (p.ej. import JSON o fetch)
   */
  constructor(catalog: TaxCatalogType) {
    this.catalog = 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.catalog.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.catalog.get(normalized);
    return found ? Maybe.some(found) : Maybe.none<TaxItemType>();
  }

  getAll(): TaxItemType[] {
    return Array.from(this.catalog.values());
  }

  /** Devuelve un objeto indexado por código, compatible con TaxMultiSelectField */
  toOptionLookup(): TaxLookupItems {
    return this.getAll().map((item) => ({
      label: item.name,
      value: item.code,
      group: item.group,
    }));
  }

  /** Devuelve la lista única de grupos disponibles */
  groups(): string[] {
    return Array.from(new Set(Array.from(this.catalog.values()).map((i) => i.group)));
  }
}
