/* global window */
// =====================================================================
// Segundo cliente Supabase → windmar-marketing (el "cerebro").
// Lee agentes (telemetría), audiencias del audience-explorer, y el RAG/knowledge.
// Aditivo: NO toca el data layer existente (Performance Marketing).
// =====================================================================
(function () {
  // Etiquetas de las tabs nuevas
  if (window.i18n) {
    if (window.i18n.es?.tabs) { window.i18n.es.tabs.agents = "Agentes"; window.i18n.es.tabs.knowledge = "Knowledge"; window.i18n.es.tabs.cro = "CRO Social"; }
    if (window.i18n.en?.tabs) { window.i18n.en.tabs.agents = "Agents"; window.i18n.en.tabs.knowledge = "Knowledge"; window.i18n.en.tabs.cro = "CRO Social"; }
  }

  const URL = window.WM_SUPABASE_URL, KEY = window.WM_SUPABASE_ANON_KEY;
  if (!URL || !KEY || !window.supabase?.createClient) {
    console.warn("[wm-data] sin config windmar-marketing");
    window.wm = { ready: false };
    return;
  }
  const wmsb = window.supabase.createClient(URL, KEY);
  window.__wmsb = wmsb;

  // RPCs públicas read-only (SECURITY DEFINER) sobre el schema marketing.
  // Si aún no están desplegadas, devolvemos [] y la vista muestra "pendiente de deploy".
  async function rpcSafe(name, args) {
    try { const { data, error } = await wmsb.rpc(name, args || {}); if (error) throw error; return data || []; }
    catch (e) { console.warn(`[wm-data] ${name}:`, e.message); return null; }
  }

  window.wm = {
    ready: true,
    // telemetría de agentes (vía RPC pública agent_feed)
    agentRuns: () => rpcSafe("agent_feed", { p_limit: 40 }),
    // audiencias / outputs del audience-explorer (vía RPC pública agent_outputs_latest)
    agentOutputs: (kind) => rpcSafe("agent_outputs_latest", { p_kind: kind || null, p_limit: 30 }),
    // RAG: knowledge_docs vive en public → lectura directa
    knowledgeBrowse: async () => {
      try {
        const { data, error } = await wmsb.from("knowledge_docs")
          .select("title, source_type, tags, project_id").order("updated_at", { ascending: false }).limit(60);
        if (error) throw error; return data || [];
      } catch (e) { console.warn("[wm-data] knowledgeBrowse:", e.message); return null; }
    },
    knowledgeSearch: async (q, slug) => {
      // usa el RPC FTS existente search_knowledge(p_project_slug, p_query, p_limit)
      return rpcSafe("search_knowledge", { p_project_slug: slug || "knowledge-hub", p_query: q, p_limit: 12 });
    },
    // CRO decisión (90d): inputs por campaña en vivo (spend + funnel CRM por lead asociado).
    // RPC público cro_campaigns_live(); cae al snapshot estático window.__CRO_CAMPAIGNS.
    croCampaignsLive: () => rpcSafe("cro_campaigns_live"),
    // CRO funnel: tasas reales por canal (maduro >=45d) desde el CRM. RPC público cro_funnel_rates();
    // cae a window.__CRO_FUNNEL_CHANNEL si no está desplegado.
    croFunnelRates: () => rpcSafe("cro_funnel_rates"),
    // CRO Ejecutivos: analytics agregado (matviews refrescadas 6h).
    croMonth: () => rpcSafe("cro_month"),       // P&L mensual por canal (6m)
    croWinloss: () => rpcSafe("cro_winloss"),   // ganados/perdidos por canal (all-time)
    croProduct: () => rpcSafe("cro_product"),   // spend + ventas por producto × canal (90d)
    croLeadStatus: () => rpcSafe("cro_lead_status"), // leads por canal × Zoho Lead_Status (Credit Fail, etc.)
    croHeadline: (ch) => rpcSafe("cro_headline_kpis", { p_channel: ch || "all" }), // rentabilidad real (lead asociado, 90d)
    // CRO Ejecutivos date-reactive: una sola RPC agrega cualquier ventana [from,to] desde matviews diarias.
    croExec: (from, to) => rpcSafe("cro_exec", { p_from: from, p_to: to }),
    // Unit economics EN VIVO (paid_ads.unit_economics) → mata el __CRO_ECON hardcodeado.
    croEconomics: () => rpcSafe("cro_unit_economics"),
    // Config CRO EN VIVO (reglas + auto_exec + catálogo de acciones) → mata __CRO_RULES/__CRO_ACTIONS.
    croConfig: () => rpcSafe("cro_config"),
    // Audiencias → decisiones: lista, revisión analítica (gate) y decisión humana.
    croAudiences: () => rpcSafe("cro_audiences"),
    croAudienceReview: (id) => rpcSafe("cro_audience_review", { p_id: id }),
    // Revisor LLM (agente de analítica: lee economics + RAG, razona como experto). Fallback a reglas.
    audienceAnalyst: async (id) => {
      try { const { data, error } = await wmsb.functions.invoke("audience-analyst", { body: { audience_id: id } }); if (error) throw error; return data; }
      catch (e) { console.warn("[wm-data] audienceAnalyst:", e.message); return null; }
    },
    croAudienceDecide: (id, action, actor) => rpcSafe("cro_audience_decide", { p_id: id, p_action: action, p_actor: actor || "dashboard" }),
    // Ejecuciones: cola de acciones sobre leads (propose-only) + aprobar/rechazar (solo status).
    leadActions: (status) => rpcSafe("cro_lead_actions_recent", { p_status: status || null, p_limit: 100 }),
    leadActionDecide: (id, status) => rpcSafe("cro_lead_action_decide", { p_id: id, p_status: status, p_actor: "dashboard" }),
    // CRO decision log: registrar cada decisión + leer la bitácora.
    logDecision: (p) => rpcSafe("cro_log_decision", { p }),
    decisionsRecent: (n) => rpcSafe("cro_decisions_recent", { p_limit: n || 50 }),
    // Agente ejecutor: invoca la edge function cro-executor para ejecutar una decisión
    // (duplicar / lookalike / A·B / budget / pause) en Meta. Gated por admin_key.
    runExecutor: async (decisionId, adminKey) => {
      try {
        const { data, error } = await wmsb.functions.invoke("cro-executor", { body: { decision_id: decisionId, admin_key: adminKey } });
        if (error) throw error; return data;
      } catch (e) { console.warn("[wm-data] runExecutor:", e.message); return { status: "error", error: e.message }; }
    },
    // CRO Social: creative performance (vía RPC creative_perf_latest); cae al seed baked si no hay live.
    creativePerf: async () => {
      const live = await rpcSafe("creative_perf_latest", { p_limit: 200 });
      if (live && live.length) return { rows: live, source: "live" };
      return { rows: (window.__CRO_SEED || []), source: "seed" };
    },
    // Solicitud de aprobación (governance gate). NO ejecuta cambios — crea un pending para Bryan/Julian.
    approvalRequest: (action, ad) => rpcSafe("approval_request", {
      p_action: action,
      p_account_id: ad.account_name || null,
      p_campaign_name: ad.campaign_name || null,
      p_ad_name: ad.ad_name || null,
      p_reason: ad._verdict_reason || null,
      p_requested_by: "dashboard",
      p_payload: null,
    }),
    counts: async () => {
      const out = {};
      try {
        const k = await wmsb.from("knowledge_docs").select("id", { count: "exact", head: true });
        out.docs = k.count ?? null;
      } catch (_) { out.docs = null; }
      return out;
    },
  };
})();
