"use client";

import { useRouter } from "next/navigation";
import { motion, AnimatePresence } from "framer-motion";
import OnboardingProgress from "./OnboardingProgress";
import { type StepKey } from "./hooks/useOnboardingSession";
import { resolveWizardLocale, type WizardLocale } from "@/lib/i18n/wizard-labels";
import { useLocale } from "@/lib/i18n/locale-provider";
import type { OnboardingStepData } from "@/lib/api-types";

import StepAccount from "./steps/StepAccount";
import StepConsent from "./steps/StepConsent";
import StepKyc from "./steps/StepKyc";
import StepFarmProfile from "./steps/StepFarmProfile";
import StepLandSketch from "./steps/StepLandSketch";
import StepGisMapping from "./steps/StepGisMapping";
import StepCropPlan from "./steps/StepCropPlan";
import StepFarmAssets from "./steps/StepFarmAssets";
import StepFinanceRequest from "./steps/StepFinanceRequest";
import StepDocuments from "./steps/StepDocuments";
import StepReview from "./steps/StepReview";
import StepScoring from "./steps/StepScoring";
import StepResult from "./steps/StepResult";

interface Props {
  session: { id?: string; currentStepKey?: string; completedSteps?: string[]; stepData?: OnboardingStepData };
  onStepSave: (step: StepKey, data: unknown, markComplete?: boolean) => Promise<unknown>;
  onSubmit: () => Promise<unknown>;
  onPollStatus: () => Promise<unknown>;
  loading: boolean;
  error: string | null;
}

const stepAnimation = {
  initial: { opacity: 0, x: 20 },
  animate: { opacity: 1, x: 0 },
  exit: { opacity: 0, x: -20 },
  transition: { duration: 0.25, ease: "easeInOut" as const },
};

function totalLandHa(stepData: OnboardingStepData): number {
  const parcels = stepData.LAND_SKETCH?.parcels ?? [];
  return parcels.reduce((sum, p) => sum + (p.areaHa ?? 0), 0);
}

function primaryParcelAreaHa(stepData: OnboardingStepData): number {
  const parcels = stepData.LAND_SKETCH?.parcels ?? [];
  const primary = parcels.find((p) => p.isPrimary) ?? parcels[0];
  return primary?.areaHa ?? totalLandHa(stepData);
}

function primaryParcelId(stepData: OnboardingStepData): string | undefined {
  const parcels = stepData.LAND_SKETCH?.parcels ?? [];
  const idx = parcels.findIndex((p) => p.isPrimary);
  return idx >= 0 ? `parcel-${idx}` : parcels.length > 0 ? "parcel-0" : undefined;
}

function suggestedRevenueUzs(stepData: OnboardingStepData): number | undefined {
  const crops = stepData.CROP_PLAN?.crops ?? [];
  if (crops.length === 0) return undefined;
  return crops.reduce((sum, c) => sum + (c.expectedYield ?? 0) * (c.areaHa ?? 0) * 2_500_000, 0);
}

export default function OnboardingWizard({
  session,
  onStepSave,
  onSubmit,
  onPollStatus,
  loading,
  error,
}: Props) {
  const router = useRouter();
  const { locale: globalLocale } = useLocale();
  const currentStep = (session?.currentStepKey ?? "ACCOUNT") as StepKey;
  const completedSteps: string[] = session?.completedSteps ?? [];
  const stepData = session?.stepData ?? {};
  const locale: WizardLocale = globalLocale ?? resolveWizardLocale(stepData);

  const handleComplete = () => {
    router.push("/farmers/login?registered=1");
  };

  const renderStep = () => {
    const baseProps = {
      loading,
      locale,
      onSave: (data: unknown) => onStepSave(currentStep, data, true),
      onSaveDraft: (data: unknown) => onStepSave(currentStep, data, false),
    };

    switch (currentStep) {
      case "ACCOUNT":
        return <StepAccount {...baseProps} data={stepData.ACCOUNT ?? {}} />;
      case "CONSENT":
        return <StepConsent {...baseProps} data={stepData.CONSENT ?? {}} />;
      case "KYC":
        return <StepKyc {...baseProps} data={stepData.KYC ?? {}} locale={locale} />;
      case "FARM_PROFILE":
        return (
          <StepFarmProfile
            {...baseProps}
            data={stepData.FARM_PROFILE ?? {}}
            kycData={stepData.KYC}
          />
        );
      case "LAND_SKETCH":
        return (
          <StepLandSketch
            {...baseProps}
            data={stepData.LAND_SKETCH ?? {}}
            defaultDistrict={stepData.FARM_PROFILE?.district}
            defaultRegion={stepData.FARM_PROFILE?.region}
          />
        );
      case "GIS_MAPPING":
        return (
          <StepGisMapping
            {...baseProps}
            data={stepData.GIS_MAPPING ?? {}}
            primaryParcelId={primaryParcelId(stepData)}
            declaredAreaHa={primaryParcelAreaHa(stepData)}
          />
        );
      case "CROP_PLAN":
        return (
          <StepCropPlan
            {...baseProps}
            data={stepData.CROP_PLAN ?? {}}
            totalLandHa={totalLandHa(stepData)}
          />
        );
      case "FARM_ASSETS":
        return <StepFarmAssets {...baseProps} data={stepData.FARM_ASSETS ?? {}} />;
      case "DOCUMENTS":
        return (
          <StepDocuments
            {...baseProps}
            data={stepData.DOCUMENTS ?? {}}
            sessionId={session?.id}
            preferredInstitution={stepData.FINANCE_REQUEST?.preferredInstitution}
          />
        );
      case "FINANCE_REQUEST": {
        const extracted = stepData.DOCUMENTS?.extractedFinancials ?? null;
        return (
          <StepFinanceRequest
            {...baseProps}
            data={stepData.FINANCE_REQUEST ?? {}}
            extractedFinancials={extracted}
            suggestedRevenueUzs={suggestedRevenueUzs(stepData)}
          />
        );
      }
      case "REVIEW":
        return (
          <StepReview
            {...baseProps}
            data={stepData.REVIEW ?? {}}
            allStepData={stepData}
            onSubmitForProcessing={onSubmit}
          />
        );
      case "SCORING":
        return (
          <StepScoring
            {...baseProps}
            data={stepData.SCORING ?? {}}
            onPollStatus={() =>
              onPollStatus().then((r) => (r as Record<string, unknown> | null) ?? null)
            }
          />
        );
      case "RESULT": {
        const scoring = stepData.SCORING ?? {};
        const result = stepData.RESULT ?? {};
        return (
          <StepResult
            {...baseProps}
            data={{ ...scoring, ...result }}
            onComplete={handleComplete}
          />
        );
      }
      default:
        return <div>Unknown step</div>;
    }
  };

  return (
    <div className="space-y-6">
      <OnboardingProgress currentStep={currentStep} completedSteps={completedSteps} locale={locale} />

      {error && (
        <div className="rounded-xl border border-red-200 bg-red-50 dark:border-red-700/30 dark:bg-red-900/20 px-4 py-3 text-sm text-red-700 dark:text-red-400 font-inter">
          {error}
        </div>
      )}

      <AnimatePresence mode="wait">
        <motion.div key={currentStep} {...stepAnimation}>
          {renderStep()}
        </motion.div>
      </AnimatePresence>
    </div>
  );
}
