import { redirect } from "next/navigation";
import { isAuthenticated } from "@/lib/auth";
import { DashboardHeader } from "@/components/dashboard/DashboardHeader";
import { DateFilter } from "@/components/dashboard/DateFilter";
import { StatisticsDashboard } from "@/components/statistics/StatisticsDashboard";
import { flattenCampaignPerformance } from "@/lib/campaign-performance";
import { loadCrmFunnelRows } from "@/lib/crm-funnel";
import { buildMonthlyProjectionCards } from "@/lib/monthly-projection-cards";
import { getActiveCampaigns, getAllTrackedEvents, getAllTrackedEventsDaily, getAppsFlyerCampaignPerformance, getAppsFlyerDailyFunnel, getMetaOnboardingDaily, getGoogleAdsOnboardingDaily, getOnboardingSuccessMetaGoogle } from "@/lib/combined-ads-api";

export const dynamic = "force-dynamic";

type StatisticsPageProps = { searchParams: Promise<{ since?: string; until?: string; previous_since?: string; previous_until?: string }> };
const PROJECT_START_DATE = "2026-07-01";
const formatDate = (date: Date) => date.toISOString().slice(0, 10);
const validDate = (value?: string) => value && /^\d{4}-\d{2}-\d{2}$/.test(value) ? value : null;
const clampStart = (date: string) => date < PROJECT_START_DATE ? PROJECT_START_DATE : date;

export default async function StatisticsPage({ searchParams }: StatisticsPageProps) {
  if (!await isAuthenticated()) redirect("/login");

  const params = await searchParams;
  const yesterday = new Date();
  yesterday.setDate(yesterday.getDate() - 1);
  const maxDate = formatDate(yesterday);
  const defaultStartDate = new Date(yesterday);
  defaultStartDate.setDate(defaultStartDate.getDate() - 6);
  const requestedUntil = clampStart(validDate(params.until) ?? maxDate);
  const until = requestedUntil > maxDate ? maxDate : requestedUntil;
  const requestedSince = clampStart(validDate(params.since) ?? formatDate(defaultStartDate));
  const since = requestedSince > until ? until : requestedSince;

  const periodDays = Math.max(1, Math.round((new Date(`${until}T00:00:00`).getTime() - new Date(`${since}T00:00:00`).getTime()) / 86400000) + 1);
  const previousEndDate = new Date(`${since}T00:00:00`);
  previousEndDate.setDate(previousEndDate.getDate() - 1);
  const previousStartDate = new Date(previousEndDate);
  previousStartDate.setDate(previousStartDate.getDate() - periodDays + 1);
  const requestedPreviousUntil = clampStart(validDate(params.previous_until) ?? formatDate(previousEndDate));
  const previousUntil = requestedPreviousUntil > maxDate ? maxDate : requestedPreviousUntil;
  const requestedPreviousSince = clampStart(validDate(params.previous_since) ?? formatDate(previousStartDate));
  const previousSince = requestedPreviousSince > previousUntil ? previousUntil : requestedPreviousSince;

  const payload = { client_id: 10, since, until, previous_since: previousSince, previous_until: previousUntil };
  const previousPayload = { client_id: 10, since: previousSince, until: previousUntil, previous_since: previousSince, previous_until: previousUntil };
  const monthlyPayload = { client_id: 10, since: PROJECT_START_DATE, until: maxDate < "2026-12-31" ? maxDate : "2026-12-31", previous_since: PROJECT_START_DATE, previous_until: PROJECT_START_DATE };

  // Cette route possède volontairement son propre cycle d'appels : aucune donnée
  // chargée par la vue globale n'est réutilisée ou partagée avec Statistiques.
  const [funnelResult, previousFunnelResult, campaignsResult, trackedResult, eventsResult, appsFlyerCampaignsResult, performanceResult, metaResult, googleResult, previousMetaResult, previousGoogleResult, crmResult, monthlyMediaResult] = await Promise.allSettled([
    getAppsFlyerDailyFunnel(payload, `statistics:${since}:${until}`),
    getAppsFlyerDailyFunnel(previousPayload, `statistics:${previousSince}:${previousUntil}`),
    getActiveCampaigns(payload, `statistics:${since}:${until}`),
    getAllTrackedEventsDaily(payload),
    getAllTrackedEvents(payload),
    getAppsFlyerCampaignPerformance({ client_id: 10, since, until }),
    getOnboardingSuccessMetaGoogle(payload, `statistics:${since}:${until}`),
    getMetaOnboardingDaily({ client_id: 10, since, until }),
    getGoogleAdsOnboardingDaily({ client_id: 10, since, until }),
    getMetaOnboardingDaily({ client_id: 10, since: previousSince, until: previousUntil }),
    getGoogleAdsOnboardingDaily({ client_id: 10, since: previousSince, until: previousUntil }),
    loadCrmFunnelRows(),
    getAppsFlyerDailyFunnel(monthlyPayload, `statistics:monthly:${monthlyPayload.until}`),
  ]);

  const currentFunnel = funnelResult.status === "fulfilled" ? funnelResult.value : { data: [] };
  const previousFunnel = previousFunnelResult.status === "fulfilled" ? previousFunnelResult.value : null;
  const apiResponse = { ...currentFunnel, previous: previousFunnel ? { period: previousFunnel.period, total: previousFunnel.total, data: previousFunnel.data } : currentFunnel.previous };
  const paidOnboarding = { meta: metaResult.status === "fulfilled" ? metaResult.value : {}, google: googleResult.status === "fulfilled" ? googleResult.value : {} };
  const previousPaidOnboarding = { meta: previousMetaResult.status === "fulfilled" ? previousMetaResult.value : {}, google: previousGoogleResult.status === "fulfilled" ? previousGoogleResult.value : {} };
  const crmRows = crmResult.status === "fulfilled" ? crmResult.value : [];
  const monthlyMedia = monthlyMediaResult.status === "fulfilled" ? monthlyMediaResult.value.data ?? [] : apiResponse.data ?? [];
  const currentCards = buildMonthlyProjectionCards({ crmRows, mediaData: monthlyMedia, selectedMonth: until.slice(0, 7), since, until });
  const previousCards = buildMonthlyProjectionCards({ crmRows, mediaData: monthlyMedia, selectedMonth: previousUntil.slice(0, 7), since: previousSince, until: previousUntil });

  return <>
    <DashboardHeader title="Statistiques d’acquisition" />
    <DateFilter since={since} until={until} previousSince={previousSince} previousUntil={previousUntil} minDate={PROJECT_START_DATE} maxDate={maxDate} />
    <StatisticsDashboard
      apiResponse={apiResponse}
      paidOnboarding={paidOnboarding}
      previousPaidOnboarding={previousPaidOnboarding}
      trackedEvents={trackedResult.status === "fulfilled" ? trackedResult.value : { days: [] }}
      onboardingEvents={eventsResult.status === "fulfilled" ? eventsResult.value : { events: [] }}
      appsFlyerCampaigns={appsFlyerCampaignsResult.status === "fulfilled" ? appsFlyerCampaignsResult.value : { campaigns: [] }}
      since={since}
      until={until}
      activeCampaignCounts={campaignsResult.status === "fulfilled" ? campaignsResult.value.counts : null}
      campaignPerformance={performanceResult.status === "fulfilled" ? flattenCampaignPerformance(performanceResult.value) : []}
      currentCdc={currentCards.cdcAccounts.rawValue}
      previousCdc={previousCards.cdcAccounts.rawValue}
    />
  </>;
}
