/**
 * Importe le fichier Excel `Tarif et conditions commande cle brevetee.xlsx`
 * vers la table `products` de Supabase.
 *
 * Usage : npm run import:xlsx -- "../Tarif et conditions commande cle brevetee.xlsx"
 *
 * Nécessite : SUPABASE_SERVICE_ROLE_KEY dans .env.local
 */
import { config } from "dotenv";
import { resolve } from "path";
import * as XLSX from "xlsx";
import { createClient } from "@supabase/supabase-js";

config({ path: ".env.local" });

const SUPABASE_URL = process.env.NEXT_PUBLIC_SUPABASE_URL!;
const SERVICE_KEY = process.env.SUPABASE_SERVICE_ROLE_KEY!;
if (!SUPABASE_URL || !SERVICE_KEY) {
  console.error("Missing NEXT_PUBLIC_SUPABASE_URL or SUPABASE_SERVICE_ROLE_KEY in .env.local");
  process.exit(1);
}

const supabase = createClient(SUPABASE_URL, SERVICE_KEY);

function parseOuiNon(v: unknown): boolean {
  if (v === null || v === undefined) return false;
  return String(v).trim().toLowerCase() === "oui";
}

function parsePrice(v: unknown): number | null {
  if (v === null || v === undefined || v === "") return null;
  if (typeof v === "number") return v;
  const cleaned = String(v)
    .replace(/€/g, "")
    .replace(/\s/g, "")
    .replace(",", ".")
    .replace(/[^\d.]/g, "");
  if (!cleaned) return null;
  const n = parseFloat(cleaned);
  return Number.isFinite(n) ? n : null;
}

interface XlsxRow {
  Fabricant?: string;
  "Modèle"?: string;
  "Prix achat HT"?: string | number;
  "Prix vente TTC conseillé"?: string | number;
  [key: string]: unknown;
}

function getCol(row: XlsxRow, ...candidates: string[]): unknown {
  for (const c of candidates) {
    for (const k of Object.keys(row)) {
      if (k.replace(/\s+/g, " ").trim() === c.replace(/\s+/g, " ").trim()) {
        return row[k];
      }
    }
  }
  return undefined;
}

async function main() {
  const xlsxPath = process.argv[2] ?? "../Tarif et conditions commande cle brevetee.xlsx";
  const absPath = resolve(process.cwd(), xlsxPath);
  console.log(`Lecture du fichier : ${absPath}`);

  const wb = XLSX.readFile(absPath);
  const sheet = wb.Sheets[wb.SheetNames[0]];
  const rows = XLSX.utils.sheet_to_json<XlsxRow>(sheet, { defval: "" });

  console.log(`${rows.length} lignes trouvées.`);

  const products: Record<string, unknown>[] = [];
  for (const row of rows) {
    const fabricant = String(getCol(row, "Fabricant") ?? "").trim();
    const modele = String(getCol(row, "Modèle") ?? "").trim();
    if (!fabricant || !modele) continue;

    const prixHt = parsePrice(getCol(row, "Prix achat HT"));
    const prixTtc = parsePrice(getCol(row, "Prix vente TTC conseillé"));
    const numeroObl = parseOuiNon(
      getCol(row, "Numéro de clé obligatoire (Oui/Non)", "Numéro de clé \nobligatoire (Oui/Non)")
    );
    const carteObl = parseOuiNon(getCol(row, "Carte de propriété obligatoire (Oui/Non)"));
    const attFab = parseOuiNon(
      getCol(row, "Si carte non fournie → Attestation fabricant obligatoire (Oui/Non)")
    );
    const attHon = parseOuiNon(
      getCol(row, "Si carte non fournie → Attestation sur l’honneur obligatoire (Oui/Non)")
    );
    const justifDom = parseOuiNon(
      getCol(row, "Si carte non fournie → Fournir justificatif de domicile < 3 mois (Oui/Non)")
    );
    const cni = parseOuiNon(
      getCol(row, "Si carte non fournie → Fournir photo CNI recto/verso (Oui/Non)")
    );
    const renouvSiPerdue = parseOuiNon(
      getCol(row, "Renouvellement carte obligatoire si perdue (Oui/Non)")
    );
    const renouvelable = parseOuiNon(getCol(row, "Carte renouvelable (Oui/Non)"));
    const fraisRenouv = parsePrice(getCol(row, "Frais de renouvellement carte (HT)"));
    const commentaire = String(getCol(row, "Commentaires / Spécificités fabricant") ?? "").trim();

    // Flags spéciaux déduits du commentaire
    const lower = commentaire.toLowerCase();
    const commandeBloquee =
      lower.includes("commande impossible") || lower.includes("impossible de commander");
    const cleOriginale = lower.includes("clé originale du client");
    const photoCle = lower.includes("photo recto/verso");

    products.push({
      fabricant,
      modele,
      prix_ht: prixHt,
      prix_ttc_conseille: prixTtc,
      numero_cle_obligatoire: numeroObl,
      carte_proprio_obligatoire: carteObl,
      attestation_fabricant_si_pas_carte: attFab,
      attestation_honneur_si_pas_carte: attHon,
      justif_domicile_si_pas_carte: justifDom,
      cni_si_pas_carte: cni,
      renouvellement_carte_si_perdue: renouvSiPerdue,
      carte_renouvelable: renouvelable,
      frais_renouvellement_ht: fraisRenouv,
      commande_bloquee_sans_carte: commandeBloquee,
      cle_originale_si_pas_carte: cleOriginale,
      photo_cle_obligatoire: photoCle,
      commentaire: commentaire || null,
      actif: true,
    });
  }

  console.log(`${products.length} produits valides à importer.`);

  let inserted = 0;
  const batchSize = 100;
  for (let i = 0; i < products.length; i += batchSize) {
    const batch = products.slice(i, i + batchSize);
    const { error } = await supabase
      .from("products")
      .upsert(batch, { onConflict: "fabricant,modele" });
    if (error) {
      console.error(`Erreur batch ${i}:`, error.message);
      process.exit(1);
    }
    inserted += batch.length;
    console.log(`  ${inserted}/${products.length} importés`);
  }

  console.log(`✓ Import terminé : ${inserted} produits.`);
}

main().catch((e) => {
  console.error(e);
  process.exit(1);
});
