import { ChartCard } from "./ChartCard";
import { KpiGrid } from "./MetricCards";
import { AppsFlyerEvolutionChart, BudgetShareChart, CampaignCpaChart, CdcRatioChart, CpaChart, CrmFunnelChart, DailySpendChart, InstallToStartRateChart, InstallsChart, MonthlyBudgetChart, MonthlyCpaCdcChart, MonthlyOnboardingSuccessCostChart, OsShareChart, PlanAccountsChart, PlanOnboardingSuccessChart, PlatformShareChart, StartToSuccessRateChart, SuccessChart } from "./Charts";
import { CampaignTable } from "./CampaignTable";
import { buildDailyDetectionCards } from "@/lib/daily-detection-cards";
import type { AppsFlyerDailyFunnelResponse } from "@/lib/daily-control-cards";
import { buildWeeklyArbitrationCards } from "@/lib/weekly-arbitration-cards";
import type { CampaignPerformance } from "@/lib/campaign-performance";
import type { MonthlyProjectionCards, MonthlyProjectionCharts } from "@/lib/monthly-projection-cards";
import type { AppsFlyerDailyStatsResponse } from "@/lib/appsflyer-daily-stats";
import type { Ga4DailyOnboardingResponse } from "@/lib/ga4-daily-onboarding";

function withAppsFlyerInstalls(apiResponse: AppsFlyerDailyFunnelResponse, stats: AppsFlyerDailyStatsResponse): AppsFlyerDailyFunnelResponse {
  const rowsByDate = new Map((apiResponse.data ?? []).map((row) => [row.date, row]));
  for (const row of stats.daily ?? []) {
    rowsByDate.set(row.date, {
      ...rowsByDate.get(row.date),
      date: row.date,
      appsflyer_installs_android: row.installs_android,
      appsflyer_installs_ios: row.installs_ios,
      appsflyer_installs_total: row.installs_total,
    });
  }
  return { ...apiResponse, data: [...rowsByDate.values()] };
}

function withGa4Onboarding(apiResponse: AppsFlyerDailyFunnelResponse, onboarding: Ga4DailyOnboardingResponse): AppsFlyerDailyFunnelResponse {
  const rowsByDate = new Map((apiResponse.data ?? []).map((row) => [row.date, row]));
  for (const row of onboarding.daily ?? []) {
    rowsByDate.set(row.date, {
      ...rowsByDate.get(row.date),
      date: row.date,
      appsflyer_installs_android: row.install_android,
      appsflyer_installs_ios: row.install_ios,
      appsflyer_installs_total: row.install_total,
      onboarding_start_active_users: row.onboarding_start_total,
      onboarding_start_active_users_android: row.onboarding_start_android,
      onboarding_start_active_users_ios: row.onboarding_start_ios,
      onboarding_success_active_users: row.contract_signed_total,
      onboarding_success_active_users_android: row.contract_signed_android,
      onboarding_success_active_users_ios: row.contract_signed_ios,
    });
  }
  return { ...apiResponse, data: [...rowsByDate.values()] };
}

export function DailyView({ apiResponse, appsFlyerDailyStats, ga4DailyOnboarding, until }: { apiResponse: AppsFlyerDailyFunnelResponse; appsFlyerDailyStats: AppsFlyerDailyStatsResponse; ga4DailyOnboarding: Ga4DailyOnboardingResponse; until: string }) {
  const detailsResponse = withGa4Onboarding(withAppsFlyerInstalls(apiResponse, appsFlyerDailyStats), ga4DailyOnboarding);
  const originalCards = buildDailyDetectionCards(apiResponse, until);
  const ga4Cards = buildDailyDetectionCards(detailsResponse, until);
  const cards = {
    ...originalCards,
    installsJ1: ga4Cards.installsJ1,
    startsJ1: ga4Cards.startsJ1,
    successJ1: ga4Cards.successJ1,
    costPerSuccess: ga4Cards.costPerSuccess,
  };
  const kpis = Object.values(cards).map((card) => ({ label: card.label, value: card.value, detail: card.subtitle, trend: card.status === "ok" ? "up" as const : card.status === "warning" || card.status === "danger" ? "down" as const : undefined }));
  const data = detailsResponse.data ?? [];
  return <><p className="purpose">Ce niveau sert à repérer une anomalie dans les 24 heures : une campagne qui s’arrête, une dépense qui dérape, une conversion qui décroche. Il ne sert pas à arbitrer un budget.</p><KpiGrid items={kpis} /><div className="chartGrid"><ChartCard title="Dépense quotidienne" subtitle="Google Ads et Meta Ads, en MAD, avec le rythme cible du plan" size="wide"><DailySpendChart data={data} /></ChartCard><ChartCard title="Répartition du jour" subtitle="Part de chaque plateforme sur la dernière journée complète" size="narrow"><PlatformShareChart data={data} /></ChartCard><ChartCard title="Évolution installs et onboarding" subtitle="Installs, onboarding start et onboarding success par jour" size="full"><AppsFlyerEvolutionChart data={data} /></ChartCard><ChartCard title="Onboardings réussis par jour" subtitle="Volume brut et moyenne mobile 7 jours — les 7 derniers jours sont incomplets"><SuccessChart data={data} /></ChartCard><ChartCard title="Coût par onboarding réussi" subtitle="Moyenne glissante 7 jours · cible 750 MAD · arbitrage au-dessus de 3 000"><CpaChart data={data} /></ChartCard><ChartCard title="Installs par système" subtitle="Android et iOS, volume quotidien"><InstallsChart data={data} /></ChartCard><ChartCard title="Install vers démarrage" subtitle="Taux de passage quotidien des installs vers un onboarding démarré" size="full"><InstallToStartRateChart data={data} /></ChartCard><ChartCard title="Démarrage vers réussite" subtitle="Taux de passage quotidien des démarrages vers un onboarding réussi" size="full"><StartToSuccessRateChart data={data} /></ChartCard></div><aside className="note"><strong>Délai de remontée.</strong> Les conversions des 7 derniers jours sont systématiquement sous-estimées. Ne jamais conclure à une dégradation sur cette fenêtre : elle est tracée en pointillé.</aside></>;
}

export function WeeklyView({ apiResponse, campaigns, until }: { apiResponse: AppsFlyerDailyFunnelResponse; campaigns: CampaignPerformance[]; until: string }) {
  const cards = buildWeeklyArbitrationCards(apiResponse, campaigns, until);
  const kpis = [{ label: "Dépense semaine", value: cards.weeklySpend.value, detail: "MAD" }, { label: "Onboardings réussis", value: cards.successfulOnboardings.value, detail: cards.partialPeriod ? "période 7 j partielle" : "sur 7 jours" }, { label: "Coût / onboarding", value: cards.costPerOnboarding.value, detail: "MAD · cible 1 500", trend: cards.costPerOnboarding.status === "ok" ? "up" as const : cards.costPerOnboarding.status === "warning" || cards.costPerOnboarding.status === "danger" ? "down" as const : undefined }, { label: "Budget sous la cible", value: cards.budgetUnderTarget.value, detail: "part des campagnes performantes" }, { label: "Part iOS du volume", value: cards.iosVolumeShare.value, detail: "des installs attribués à un OS" }, { label: "Part iOS des réussites", value: cards.iosSuccessShare.value, detail: "des réussites attribuées à un OS" }];
  return <><p className="purpose">Ce niveau sert à décider où déplacer du budget. Il compare les campagnes entre elles sur une fenêtre assez longue pour être stable, et assez courte pour rester actionnable.</p><KpiGrid items={kpis} /><div className="chartGrid"><ChartCard title="Coût par onboarding réussi, par campagne" subtitle="En MAD, face à la cible de 1 500 — trafic payant uniquement" size="wide" tall><CampaignCpaChart campaigns={campaigns} /></ChartCard><ChartCard title="Où va le budget" subtitle="Part des campagnes sous et au-dessus de la cible" size="narrow" tall><BudgetShareChart campaigns={campaigns} /></ChartCard><ChartCard title="Android contre iOS" subtitle="Part du volume et part des onboardings réussis"><OsShareChart data={apiResponse.data ?? []} until={until} /></ChartCard><ChartCard title="Détail par campagne" subtitle="Classement par coût par onboarding réussi"><CampaignTable campaigns={campaigns} /></ChartCard></div></>;
}

export function MonthlyView({ cards, charts }: { cards: MonthlyProjectionCards; charts: MonthlyProjectionCharts }) {
  const number = (value: number | undefined) => value === undefined ? "N/A" : Math.round(value).toLocaleString("fr-FR");
  const percent = (value: number | null | undefined) => value == null ? "N/A" : `${value.toLocaleString("fr-FR", { minimumFractionDigits: 1, maximumFractionDigits: 1 })} %`;
  const kpis = [{ label: "Comptes CDC", value: cards.cdcAccounts.value, detail: `sur ${number(cards.cdcAccounts.target)} visés · ${percent(cards.cdcAccounts.progress)}` }, { label: "Comptes finalisés", value: cards.finalizedAccounts.value, detail: `sur ${number(cards.finalizedAccounts.target)} attendus` }, { label: "Ratio CDC réel", value: cards.cdcRatio.value, detail: `contre ${number(cards.cdcRatio.target)} % au plan` }, { label: "CPA par compte CDC", value: cards.cpaCdc.value, detail: `MAD · cible ${number(cards.cpaCdc.targetMin)}–${number(cards.cpaCdc.targetMax)}` }, { label: "Budget consommé", value: cards.budgetConsumed.value, detail: "du budget planifié" }, { label: "Dossiers uniques", value: cards.openCases.value, detail: "snapshot CRM complet" }];
  return <>
    <p className="purpose">Ce niveau répond à une seule question : tient-on la trajectoire du plan ? Il se lit avec le plan BCG à côté, pas seul.</p>
    <KpiGrid items={kpis} />
    <div className="chartGrid">
      <ChartCard title="Comptes CDC contre objectif du plan" subtitle="Réalisé mensuel et objectif, de juillet à décembre" size="full" tall><PlanAccountsChart data={charts.cdcVsPlan} /></ChartCard>
      <ChartCard title="Ratio de comptes CDC" subtitle="Part de CDC parmi les comptes finalisés, contre l’hypothèse du plan" size="full" tall><CdcRatioChart data={charts.cdcRatio} /></ChartCard>
      <ChartCard title="Entonnoir des dossiers" subtitle="État global du portefeuille CRM — snapshot complet" size="full"><CrmFunnelChart data={charts.funnel} /></ChartCard>
      <ChartCard title="Coût par CDC par mois" subtitle="Dépense mensuelle divisée par les comptes CDC réalisés · objectif 1 500 MAD" size="full" tall><MonthlyCpaCdcChart data={charts.cpaCdcVsTarget} /></ChartCard>
      <ChartCard title="Onboarding Success contre objectif du plan" subtitle="Meta Ads + Google Ads par mois · objectif égal à 2 × l’objectif CDC" size="full" tall><PlanOnboardingSuccessChart data={charts.onboardingSuccessVsPlan} /></ChartCard>
      <ChartCard title="Coût par Onboarding Success par mois" subtitle="Dépense mensuelle divisée par les réussites Meta Ads + Google Ads · objectif 750 MAD" size="full" tall><MonthlyOnboardingSuccessCostChart data={charts.costPerOnboardingSuccessVsTarget} /></ChartCard>
      <ChartCard title="Budget consommé contre plan" subtitle="En MAD, mois par mois" size="full"><MonthlyBudgetChart data={charts.budgetVsPlan} /></ChartCard>
    </div>
    <aside className="note"><strong>Le ratio CDC est la variable à surveiller en priorité.</strong> Mesuré à {cards.cdcRatio.value} contre 50 % supposés au plan, une dérive silencieuse de quelques points déplace le CPA de plusieurs centaines de MAD.</aside>
  </>;
}
