/* Keepa client — appelle /api/keepa (proxy Cloudflare avec KEEPA_KEY).
   Cache localStorage 6h pour éviter de cramer les tokens. */

const KEEPA_CACHE_KEY = "kcc:keepa:v1";
const KEEPA_TTL_MS = 6 * 60 * 60 * 1000; // 6h

const loadKeepaCache = () => {
  try { return JSON.parse(localStorage.getItem(KEEPA_CACHE_KEY) || "{}"); }
  catch { return {}; }
};

const saveKeepaCache = (obj) => {
  try { localStorage.setItem(KEEPA_CACHE_KEY, JSON.stringify(obj)); }
  catch { /* localStorage full or disabled */ }
};

const getKeepaCached = (asin) => {
  const cache = loadKeepaCache();
  const entry = cache[asin];
  if (!entry) return null;
  if (Date.now() - entry._ts > KEEPA_TTL_MS) return null;
  return entry;
};

const putKeepaCached = (asin, data) => {
  const cache = loadKeepaCache();
  cache[asin] = { ...data, _ts: Date.now() };
  saveKeepaCache(cache);
};

// Appel direct au proxy /api/keepa
window.fetchKeepa = async (asin, { force = false } = {}) => {
  if (!asin || !/^[A-Z0-9]{10}$/i.test(asin)) {
    throw new Error("ASIN invalide");
  }
  const up = asin.toUpperCase();
  if (!force) {
    const cached = getKeepaCached(up);
    if (cached) return cached;
  }
  const resp = await fetch(`/api/keepa?asin=${encodeURIComponent(up)}`);
  const data = await resp.json();
  if (!resp.ok) {
    throw new Error(data.error || `HTTP ${resp.status}`);
  }
  putKeepaCached(up, data);
  return data;
};

// Hook: récupère + rafraîchit en fond. Retourne { data, loading, error, refresh }
window.useKeepa = (asin, { auto = false } = {}) => {
  const [data, setData] = React.useState(() => asin ? getKeepaCached(asin.toUpperCase()) : null);
  const [loading, setLoading] = React.useState(false);
  const [error, setError] = React.useState(null);

  const refresh = React.useCallback(async (force = true) => {
    if (!asin) return;
    setLoading(true); setError(null);
    try {
      const fresh = await window.fetchKeepa(asin, { force });
      setData(fresh);
    } catch (e) {
      setError(e.message || "Erreur Keepa");
    } finally {
      setLoading(false);
    }
  }, [asin]);

  React.useEffect(() => {
    if (auto && asin && !getKeepaCached(asin.toUpperCase())) {
      refresh(false);
    }
  }, [asin, auto, refresh]);

  return { data, loading, error, refresh };
};

// Bulk refresh helper (one-shot, sequentiel pour respecter rate limit)
window.refreshKeepaBulk = async (asins, { onProgress } = {}) => {
  const results = {};
  for (let i = 0; i < asins.length; i++) {
    const a = asins[i];
    try {
      results[a] = await window.fetchKeepa(a, { force: true });
    } catch (e) {
      results[a] = { error: e.message };
    }
    onProgress?.({ done: i + 1, total: asins.length, asin: a });
    // Throttle: 1 req/sec to be safe on Keepa free tier (1 token/min sur 1 ASIN)
    if (i < asins.length - 1) await new Promise(r => setTimeout(r, 1100));
  }
  return results;
};

// Petit composant cellule: bouton refresh + valeurs Keepa
const KeepaCell = ({ asin, fields = ["bsr_current"], style = {}, auto = true, fallback = null, compact = false }) => {
  const { data, loading, error, refresh } = window.useKeepa(asin, { auto });
  const fmt = (k, v) => {
    if (v == null) return null;
    if (k === "bsr_current" || k === "bsr_avg90") return Number(v).toLocaleString("fr-CA");
    if (k.startsWith("price")) return "$" + v;
    if (k === "amazon_oos_pct90") return Math.round(v) + "%";
    return v;
  };
  const primaryField = fields && fields.length > 0 ? fields[0] : null;
  const primaryVal = (data && primaryField) ? fmt(primaryField, data[primaryField]) : null;
  const displayVal = primaryVal != null ? primaryVal : fallback;
  return (
    <div className="row" style={{ gap: 6, ...style }}>
      <button
        className="icon-btn"
        onClick={(e) => { e.stopPropagation(); refresh(true); }}
        disabled={loading}
        title={error ? `Erreur: ${error}` : data ? `Keepa · ${data.fetched ? new Date(data.fetched).toLocaleString("fr-CA") : "cache"} · ${data.tokens_left ?? "?"} tokens` : "Charger depuis Keepa"}
        style={{ width: compact ? 16 : 22, height: compact ? 16 : 22, padding: 0, minWidth: compact ? 16 : 22 }}
      >
        <Icon name="refresh" size={compact ? 9 : 11} style={{ animation: loading ? "spin 1s linear infinite" : "none", color: error ? "var(--red)" : data ? "var(--green)" : "var(--text-dim)" }}/>
      </button>
      {fields && fields.length > 1 && data
        ? fields.map(f => <span key={f} className="mono" style={{ fontSize: 11 }}>{fmt(f, data[f]) || "—"}</span>)
        : (displayVal != null ? <span className="mono" style={{ fontSize: 11 }}>{displayVal}</span> : null)
      }
    </div>
  );
};

window.KeepaCell = KeepaCell;
