import type { AppsFlyerCampaignPerformanceResponse, AppsFlyerCampaignRecord } from "@/lib/appsflyer-campaign-performance";
import type { ReactNode } from "react";

const firstNumber = (row: AppsFlyerCampaignRecord, ...keys: string[]) => {
  for (const key of keys) if (typeof row[key] === "number" || (typeof row[key] === "string" && row[key] !== "")) return Number(row[key]) || 0;
  return 0;
};
const firstString = (row: AppsFlyerCampaignRecord, ...keys: string[]) => {
  for (const key of keys) if (typeof row[key] === "string" && row[key]) return String(row[key]);
  return "—";
};
const extractGroup = (group: AppsFlyerCampaignPerformanceResponse["meta_ads"], platform: string) => {
  const rows = Array.isArray(group) ? group : group?.campaigns ?? [];
  return rows.map((row) => ({ ...row, platform: firstString(row, "platform") === "—" ? platform : firstString(row, "platform") }));
};
const compact = new Intl.NumberFormat("fr-FR", { notation: "compact", maximumFractionDigits: 1 });
const money = new Intl.NumberFormat("fr-FR", { maximumFractionDigits: 0 });

export function AppsFlyerCampaignTable({ response }: { response: AppsFlyerCampaignPerformanceResponse }) {
  const records = response.campaigns?.length ? response.campaigns : response.data?.length ? response.data : [...extractGroup(response.meta_ads, "Meta Ads"), ...extractGroup(response.google_ads, "Google Ads")];
  const rows = records.map((row) => {
    const spend = firstNumber(row, "spend_mad", "spend", "total_spend");
    const impressions = firstNumber(row, "impressions", "total_impressions");
    const installs = firstNumber(row, "installs", "appsflyer_installs", "appsflyer_installs_total");
    const starts = firstNumber(row, "onboarding_start", "onboarding_starts", "onboarding_start_active_users");
    const successes = firstNumber(row, "onboarding_success", "onboarding_successes", "onboarding_success_active_users");
    return { row, spend, impressions, installs, starts, successes, cpi: installs > 0 ? spend / installs : null, startCost: starts > 0 ? spend / starts : null, successCost: successes > 0 ? spend / successes : null, installToStart: installs > 0 ? starts / installs * 100 : null, startToSuccess: starts > 0 ? successes / starts * 100 : null };
  });
  const metric = (value: number | null, suffix = "") => value === null ? "N/A" : `${money.format(value)}${suffix}`;
  type CampaignRow = (typeof rows)[number];
  const hasData = (select: (row: CampaignRow) => number | null) => rows.some((row) => {
    const value = select(row);
    return typeof value === "number" && Number.isFinite(value) && value !== 0;
  });
  const metricColumns: { label: string; select: (row: CampaignRow) => number | null; render: (value: number | null) => ReactNode }[] = [
    { label: "Dépense", select: (item) => item.spend, render: (value) => metric(value, " MAD") },
    { label: "Impressions", select: (item) => item.impressions, render: (value) => compact.format(value ?? 0) },
    { label: "Installs", select: (item) => item.installs, render: (value) => compact.format(value ?? 0) },
    { label: "CPI", select: (item) => item.cpi, render: (value) => metric(value, " MAD") },
    { label: "Démarrages", select: (item) => item.starts, render: (value) => compact.format(value ?? 0) },
    { label: "Coût / démarrage", select: (item) => item.startCost, render: (value) => metric(value, " MAD") },
    { label: "Réussites", select: (item) => item.successes, render: (value) => compact.format(value ?? 0) },
    { label: "Coût / réussite", select: (item) => item.successCost, render: (value) => metric(value, " MAD") },
    { label: "Install → démarrage", select: (item) => item.installToStart, render: (value) => metric(value, "%") },
    { label: "Démarrage → réussite", select: (item) => item.startToSuccess, render: (value) => metric(value, "%") },
  ];
  const visibleMetricColumns = metricColumns.filter((column) => hasData(column.select));

  return <article className="campaignPerformanceCard"><header><p>Performance des campagnes</p><h3>AppsFlyer Campaign Performance</h3><span>Analyse par campagne sur la période sélectionnée.</span></header><div className="campaignPerformanceScroll"><table className="campaignPerformanceTable"><thead><tr><th>Campagne</th><th>Plateforme</th><th>Statut</th>{visibleMetricColumns.map((column) => <th key={column.label}>{column.label}</th>)}</tr></thead><tbody>{rows.map((item, index) => <tr key={`${firstString(item.row, "campaign_id", "id")}-${index}`}><td>{firstString(item.row, "campaign_name", "name", "campaign")}</td><td><span className="campaignPlatform">{firstString(item.row, "platform", "media_source", "source")}</span></td><td><span className={`campaignStatus ${firstString(item.row, "status", "effective_status").toLowerCase() === "active" ? "active" : ""}`}>{firstString(item.row, "status", "effective_status")}</span></td>{visibleMetricColumns.map((column) => <td key={column.label}>{column.render(column.select(item))}</td>)}</tr>)}</tbody></table>{!rows.length && <p className="campaignPerformanceEmpty">Aucune campagne retournée pour cette période.</p>}</div></article>;
}
