import { AcquisitionDashboard } from "@/components/dashboard/AcquisitionDashboard";
import { DateFilter } from "@/components/dashboard/DateFilter";
import { DashboardHeader } from "@/components/dashboard/DashboardHeader";
import { getActiveCampaigns, getAllTrackedEvents, getAllTrackedEventsDaily, getAppsFlyerCampaignPerformance, getAppsFlyerDailyFunnel, getAppsFlyerDailyStats, getGa4DailyOnboarding, getGoogleAdsOnboardingDaily, getGoogleAdsOnboardingMonthly, getMetaOnboardingDaily, getMetaOnboardingMonthly, getOnboardingSuccessMetaGoogle } from "@/lib/combined-ads-api";
import { flattenCampaignPerformance } from "@/lib/campaign-performance";
import { loadCrmFunnelRows } from "@/lib/crm-funnel";
import { buildMonthlyProjectionCards, buildMonthlyProjectionCharts } from "@/lib/monthly-projection-cards";
import { buildWeeklyPeriod, subtractDays } from "@/lib/dashboard-periods";
import { validateCampaignData, validateDailyData } from "@/lib/dashboard-consistency";
import { isAuthenticated } from "@/lib/auth";
import { redirect } from "next/navigation";
import { writeGlobalOverviewLog, type GlobalOverviewLogSection } from "@/lib/global-overview-logger";
import { ApiError } from "@/lib/api-client";

export const dynamic = "force-dynamic";

type HomeProps = {
  searchParams: Promise<{ since?: string; until?: string; previous_since?: string; previous_until?: string }>;
};

const formatDate = (date: Date) => date.toISOString().slice(0, 10);
const validDate = (value: string | undefined) => value && /^\d{4}-\d{2}-\d{2}$/.test(value) ? value : null;
const PROJECT_START_DATE = "2026-07-01";
const clampToProjectStart = (date: string) => date < PROJECT_START_DATE ? PROJECT_START_DATE : date;

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

  const params = await searchParams;
  const yesterday = new Date();
  yesterday.setDate(yesterday.getDate() - 1);
  const maxDate = formatDate(yesterday);
  const sevenDayWindowStart = new Date(yesterday);
  sevenDayWindowStart.setDate(sevenDayWindowStart.getDate() - 6);
  const defaultSince = formatDate(sevenDayWindowStart);
  const requestedUntil = clampToProjectStart(validDate(params.until) ?? maxDate);
  const until = requestedUntil > maxDate ? maxDate : requestedUntil;
  const requestedSince = clampToProjectStart(validDate(params.since) ?? defaultSince);
  const since = requestedSince > until ? until : requestedSince;
  const currentStart = new Date(`${since}T00:00:00`);
  const currentEnd = new Date(`${until}T00:00:00`);
  const periodLength = Math.max(1, Math.round((currentEnd.getTime() - currentStart.getTime()) / 86400000) + 1);
  const previousEnd = new Date(currentStart);
  previousEnd.setDate(previousEnd.getDate() - 1);
  const previousStart = new Date(previousEnd);
  previousStart.setDate(previousStart.getDate() - periodLength + 1);
  const defaultPreviousUntil = clampToProjectStart(formatDate(previousEnd));
  const requestedPreviousUntil = clampToProjectStart(validDate(params.previous_until) ?? defaultPreviousUntil);
  const previousUntil = requestedPreviousUntil > maxDate ? maxDate : requestedPreviousUntil;
  const defaultPreviousSince = clampToProjectStart(formatDate(previousStart));
  const requestedPreviousSince = clampToProjectStart(validDate(params.previous_since) ?? defaultPreviousSince);
  const previousSince = requestedPreviousSince > previousUntil ? previousUntil : requestedPreviousSince;

  const payload = {
    client_id: 10,
    since,
    until,
    previous_since: previousSince,
    previous_until: previousUntil,
  };
  const monthlyMediaPayload = {
    client_id: 10,
    since: "2026-07-01",
    until: maxDate < "2026-12-31" ? maxDate : "2026-12-31",
    previous_since: PROJECT_START_DATE,
    previous_until: PROJECT_START_DATE,
  };
  const monthlyOnboardingPeriod = {
    since: PROJECT_START_DATE,
    until: formatDate(new Date()),
  };
  const weeklyPeriod = buildWeeklyPeriod(until);
  const weeklyCampaignPayload = {
    client_id: 10,
    ...weeklyPeriod,
    previous_since: clampToProjectStart(subtractDays(weeklyPeriod.since, 7)),
    previous_until: clampToProjectStart(subtractDays(weeklyPeriod.since, 1)),
  };
  const previousPayload = {
    client_id: payload.client_id,
    since: payload.previous_since,
    until: payload.previous_until,
    previous_since: payload.previous_since,
    previous_until: payload.previous_until,
  };
  const previousWeeklyPayload = {
    client_id: weeklyCampaignPayload.client_id,
    since: weeklyCampaignPayload.previous_since,
    until: weeklyCampaignPayload.previous_until,
    previous_since: weeklyCampaignPayload.previous_since,
    previous_until: weeklyCampaignPayload.previous_until,
  };
  const periodKey = `${since}:${until}`;
  const [funnelResult, appsFlyerDailyStatsResult, ga4DailyOnboardingResult, previousFunnelResult, weeklyFunnelResult, weeklyGa4DailyOnboardingResult, previousWeeklyFunnelResult, campaignsResult, overviewCampaignPerformanceResult, campaignPerformanceResult, crmResult, monthlyMediaResult, trackedEventsResult, onboardingEventsResult, appsFlyerCampaignsResult, metaOnboardingResult, googleOnboardingResult, previousMetaOnboardingResult, previousGoogleOnboardingResult, monthlyMetaOnboardingResult, monthlyGoogleOnboardingResult] = await Promise.allSettled([
    getAppsFlyerDailyFunnel(payload, periodKey),
    getAppsFlyerDailyStats({ client_id: payload.client_id, since, until }),
    getGa4DailyOnboarding({ client_id: payload.client_id, since, until }),
    getAppsFlyerDailyFunnel(previousPayload, `${previousPayload.since}:${previousPayload.until}`),
    getAppsFlyerDailyFunnel(weeklyCampaignPayload, `${weeklyPeriod.since}:${weeklyPeriod.until}`),
    getGa4DailyOnboarding({ client_id: payload.client_id, since: weeklyPeriod.since, until: weeklyPeriod.until }),
    getAppsFlyerDailyFunnel(previousWeeklyPayload, `${previousWeeklyPayload.since}:${previousWeeklyPayload.until}`),
    getActiveCampaigns(payload, periodKey),
    getOnboardingSuccessMetaGoogle(payload, periodKey),
    getOnboardingSuccessMetaGoogle(weeklyCampaignPayload, `${weeklyCampaignPayload.since}:${weeklyCampaignPayload.until}`),
    loadCrmFunnelRows(),
    getAppsFlyerDailyFunnel(monthlyMediaPayload, periodKey),
    getAllTrackedEventsDaily(payload),
    getAllTrackedEvents(payload),
    getAppsFlyerCampaignPerformance({ client_id: payload.client_id, since, until }),
    getMetaOnboardingDaily({ client_id: payload.client_id, since, until }),
    getGoogleAdsOnboardingDaily({ client_id: payload.client_id, since, until }),
    getMetaOnboardingDaily({ client_id: payload.client_id, since: previousSince, until: previousUntil }),
    getGoogleAdsOnboardingDaily({ client_id: payload.client_id, since: previousSince, until: previousUntil }),
    getMetaOnboardingMonthly({ client_id: payload.client_id, ...monthlyOnboardingPeriod }),
    getGoogleAdsOnboardingMonthly({ client_id: payload.client_id, ...monthlyOnboardingPeriod }),
  ]);
  const appsFlyerDailyStats = appsFlyerDailyStatsResult.status === "fulfilled" ? appsFlyerDailyStatsResult.value : { daily: [] };
  const ga4DailyOnboarding = ga4DailyOnboardingResult.status === "fulfilled" ? ga4DailyOnboardingResult.value : { daily: [] };
  const paidOnboarding = {
    meta: metaOnboardingResult.status === "fulfilled" ? metaOnboardingResult.value : {},
    google: googleOnboardingResult.status === "fulfilled" ? googleOnboardingResult.value : {},
  };
  const previousPaidOnboarding = {
    meta: previousMetaOnboardingResult.status === "fulfilled" ? previousMetaOnboardingResult.value : {},
    google: previousGoogleOnboardingResult.status === "fulfilled" ? previousGoogleOnboardingResult.value : {},
  };
  const monthlyPaidOnboarding = {
    meta: monthlyMetaOnboardingResult.status === "fulfilled" ? monthlyMetaOnboardingResult.value : {},
    google: monthlyGoogleOnboardingResult.status === "fulfilled" ? monthlyGoogleOnboardingResult.value : {},
  };
  const weeklyGa4DailyOnboarding = weeklyGa4DailyOnboardingResult.status === "fulfilled" ? weeklyGa4DailyOnboardingResult.value : { daily: [] };
  const currentApiResponse = funnelResult.status === "fulfilled" ? funnelResult.value : { data: [] };
  const previousApiResponse = previousFunnelResult.status === "fulfilled" ? previousFunnelResult.value : null;
  const apiResponse = {
    ...currentApiResponse,
    previous: previousApiResponse ? {
      period: previousApiResponse.period,
      total: previousApiResponse.total,
      data: previousApiResponse.data,
    } : currentApiResponse.previous,
  };
  const currentWeeklyApiResponse = weeklyFunnelResult.status === "fulfilled" ? weeklyFunnelResult.value : { data: [] };
  const previousWeeklyApiResponse = previousWeeklyFunnelResult.status === "fulfilled" ? previousWeeklyFunnelResult.value : null;
  const weeklyApiResponse = {
    ...currentWeeklyApiResponse,
    previous: previousWeeklyApiResponse ? {
      period: previousWeeklyApiResponse.period,
      total: previousWeeklyApiResponse.total,
      data: previousWeeklyApiResponse.data,
    } : currentWeeklyApiResponse.previous,
  };
  const activeCampaignCounts = campaignsResult.status === "fulfilled" ? campaignsResult.value.counts : null;
  const overviewCampaignPerformance = overviewCampaignPerformanceResult.status === "fulfilled"
    ? flattenCampaignPerformance(overviewCampaignPerformanceResult.value)
    : [];
  const campaignPerformance = campaignPerformanceResult.status === "fulfilled"
    ? flattenCampaignPerformance(campaignPerformanceResult.value)
    : [];
  const crmRows = crmResult.status === "fulfilled" ? crmResult.value : [];
  const monthlyMediaData = monthlyMediaResult.status === "fulfilled" ? monthlyMediaResult.value.data ?? [] : apiResponse.data ?? [];
  const trackedEvents = trackedEventsResult.status === "fulfilled" ? trackedEventsResult.value : { days: [] };
  const onboardingEvents = onboardingEventsResult.status === "fulfilled" ? onboardingEventsResult.value : { events: [] };
  const appsFlyerCampaigns = appsFlyerCampaignsResult.status === "fulfilled" ? appsFlyerCampaignsResult.value : { campaigns: [] };
  const selectedMonth = until.slice(0, 7);
  const monthlyProjectionCards = buildMonthlyProjectionCards({
    crmRows,
    mediaData: monthlyMediaData,
    selectedMonth,
    since,
    until,
  });
  const previousMonthlyProjectionCards = buildMonthlyProjectionCards({
    crmRows,
    mediaData: monthlyMediaData,
    selectedMonth: payload.previous_until.slice(0, 7),
    since: payload.previous_since,
    until: payload.previous_until,
  });
  const monthlyProjectionCharts = buildMonthlyProjectionCharts({ crmRows, mediaData: monthlyMediaData, paidOnboarding: monthlyPaidOnboarding });
  validateDailyData(apiResponse, since, until);
  validateDailyData(weeklyApiResponse, weeklyPeriod.since, weeklyPeriod.until);
  if (overviewCampaignPerformanceResult.status === "fulfilled") validateCampaignData(overviewCampaignPerformanceResult.value, since, until);
  if (campaignPerformanceResult.status === "fulfilled") validateCampaignData(campaignPerformanceResult.value, weeklyPeriod.since, weeklyPeriod.until);

  const resultValue = <T,>(result: PromiseSettledResult<T>) => {
    if (result.status === "fulfilled") return result.value;
    if (result.reason instanceof ApiError) {
      return {
        error: {
          name: result.reason.name,
          message: result.reason.message,
          status: result.reason.status,
          statusText: result.reason.statusText,
          responseBody: result.reason.responseBody,
        },
      };
    }
    return { error: result.reason instanceof Error ? { name: result.reason.name, message: result.reason.message } : result.reason };
  };
  const dailyFunnelApi = "/api/meta-ads-data/getAppsFlyerDailyFunnel";
  const activeCampaignsApi = "/api/meta-ads-data/getActiveCampaigns";
  const trackedEventsDailyApi = "/api/google-analytics/getAllTrackedEventsdaily";
  const trackedEventsApi = "/api/google-analytics/getAllTrackedEvents";
  const appsFlyerCampaignsApi = "/api/meta-ads-data/getAppsFlyerCampaignPerformance";
  const campaignPerformanceApi = "/api/meta-ads-data/getOnboardingSuccessMetaGoogle";
  const metaOnboardingApi = "/api/meta-ads-data/getMetaOnboardingDaily";
  const googleOnboardingApi = "/api/google-ads/getGoogleAdsOnboardingDaily";
  const crmSource = "CRM local (loadCrmFunnelRows)";
  const funnelResponse = resultValue(funnelResult);
  const crmResponse = resultValue(crmResult);
  const paidOnboardingResponse = { meta: resultValue(metaOnboardingResult), google: resultValue(googleOnboardingResult) };
  const overviewLogSections: GlobalOverviewLogSection[] = [
    { title: "Campagnes actives", api: activeCampaignsApi, response: resultValue(campaignsResult) },
    { title: "Dépense publicitaire", api: dailyFunnelApi, response: funnelResponse },
    { title: "Installs", api: [metaOnboardingApi, googleOnboardingApi], response: paidOnboardingResponse },
    { title: "Coût / install (CPI)", api: [dailyFunnelApi, metaOnboardingApi, googleOnboardingApi], response: { media: funnelResponse, onboarding: paidOnboardingResponse } },
    { title: "Démarrages onboarding", api: [metaOnboardingApi, googleOnboardingApi], response: paidOnboardingResponse },
    { title: "Coût / démarrage", api: [dailyFunnelApi, metaOnboardingApi, googleOnboardingApi], response: { media: funnelResponse, onboarding: paidOnboardingResponse } },
    { title: "Onboardings réussis", api: [metaOnboardingApi, googleOnboardingApi], response: paidOnboardingResponse },
    { title: "Coût / réussite", api: [dailyFunnelApi, metaOnboardingApi, googleOnboardingApi], response: { media: funnelResponse, onboarding: paidOnboardingResponse } },
    { title: "CDC", api: crmSource, response: crmResponse },
    { title: "Coût / CDC", api: [dailyFunnelApi, crmSource], response: { media: funnelResponse, crm: crmResponse } },
    { title: "Distribution des événements", api: trackedEventsDailyApi, response: resultValue(trackedEventsResult) },
    { title: "Paid Media Funnel", api: dailyFunnelApi, response: funnelResponse },
    { title: "Indicateurs d'efficacité des coûts", api: [dailyFunnelApi, crmSource], response: { media: funnelResponse, crm: crmResponse } },
    { title: "Install vers démarrage", api: dailyFunnelApi, response: funnelResponse },
    { title: "Démarrage vers réussite", api: dailyFunnelApi, response: funnelResponse },
    { title: "Cost Evolution (Daily)", api: [dailyFunnelApi, crmSource], response: { media: funnelResponse, crm: crmResponse } },
    { title: "Performance des campagnes AppsFlyer", api: appsFlyerCampaignsApi, response: resultValue(appsFlyerCampaignsResult) },
    { title: "Onboarding Funnel", api: trackedEventsApi, response: resultValue(onboardingEventsResult) },
    { title: "Coût par onboarding réussi, par campagne", api: campaignPerformanceApi, response: resultValue(overviewCampaignPerformanceResult) },
    { title: "Dépenses par plateforme", api: dailyFunnelApi, response: funnelResponse },
    { title: "Démarrages onboarding (OS)", api: dailyFunnelApi, response: funnelResponse },
    { title: "Réussites onboarding (OS)", api: dailyFunnelApi, response: funnelResponse },
  ];
  await writeGlobalOverviewLog({ since, until }, overviewLogSections);

  return (
    <>
      <DashboardHeader />
      <DateFilter since={since} until={until} previousSince={payload.previous_since} previousUntil={payload.previous_until} minDate={PROJECT_START_DATE} maxDate={maxDate} />
      <AcquisitionDashboard apiResponse={apiResponse} appsFlyerDailyStats={appsFlyerDailyStats} ga4DailyOnboarding={ga4DailyOnboarding} paidOnboarding={paidOnboarding} previousPaidOnboarding={previousPaidOnboarding} weeklyGa4DailyOnboarding={weeklyGa4DailyOnboarding} weeklyApiResponse={weeklyApiResponse} trackedEvents={trackedEvents} onboardingEvents={onboardingEvents} appsFlyerCampaigns={appsFlyerCampaigns} since={since} until={until} weeklySince={weeklyPeriod.since} activeCampaignCounts={activeCampaignCounts} overviewCampaignPerformance={overviewCampaignPerformance} campaignPerformance={campaignPerformance} monthlyProjectionCards={monthlyProjectionCards} previousCdcAccounts={previousMonthlyProjectionCards.cdcAccounts.rawValue} monthlyProjectionCharts={monthlyProjectionCharts} />
    </>
  );
}
