import type {
  ComplianceItem,
  FarmerDashboardResponse,
  FinanceModule,
  IdentityModule,
  InputsModule,
  LandEvidenceItem,
  YieldHistoryEntry,
} from "@/lib/api-types";

export interface FinanceViewModel {
  purpose: string;
  amount: string;
  existingLoans: string;
  monthlyIncome: string;
  repaymentHistory: string;
  caseId: string;
  status: "pending" | "under_review" | "approved" | "rejected";
  stages: { label: string; completed: boolean; timestamp?: string }[];
  riskPd?: number;
  riskRating?: string;
  ifrs9Stage?: number;
  cbuClass?: number;
  farmerExplanation?: { uz?: string; ru?: string; en?: string };
  satelliteImages?: string[];
  scoringComplete?: boolean;
  eligibilityScore?: number;
  eligibilityLabel?: string;
  routedInstitution?: { name: string; priority: string; isBestMatch: boolean };
  sla?: { remainingHours: number; totalHours: number; dueAt: string };
  bankMatches?: Array<{ name: string; score: number; status: "routed" | "view" }>;
  documents?: Array<{ name: string; status: "verified" | "pending" }>;
}

export interface CropEntry {
  crop: string;
  variety: string;
  season: string;
  expectedYield: string;
}

export interface TradeViewModel {
  crops: CropEntry[];
  buyerMatches: { buyerName: string; commodity: string; priceRange: string }[];
  exportDocsComplete: boolean;
}

export interface IdentityViewModel {
  fullName: string;
  region?: string;
  district: string;
  gender: string;
  kycStatus: string;
  farmSizeHa: string;
  landOwnership: string;
  hasGisMapping: boolean;
  documentCompleteness: number;
  farmerId?: string;
  farmName?: string;
  ekyc?: { photoUrl?: string; dob?: string; aadhaarMasked?: string; mobileMasked?: string };
  gis?: {
    areaHa: number;
    lat: number;
    lng: number;
    polygonGeoJson?: { type: "Polygon"; coordinates: number[][][] };
  };
  landEvidence?: Array<{ name: string; type: "pdf" | "doc"; verified: boolean }>;
  yieldHistory?: Array<{ year: number; yieldTHa: number; crop: string }>;
  compliance?: Array<{ key: string; label: string; passed: boolean }>;
}

export interface AssetEntry {
  assetType: string;
  description: string;
  estimatedValue: string;
  condition: string;
}

export interface InputsViewModel {
  assets: AssetEntry[];
  recommendedInputs: { name: string; category: string; relevance: string }[];
  kpis?: { seed: number; fertiliser: number; equipment: number; vouchers: number; inTransit: number };
  suppliers?: Array<{ name: string; logoUrl?: string; rating: number }>;
  catalog?: Array<{
    category: string;
    items: Array<{ id: string; name: string; unitPrice: number; currency: string; imageUrl?: string }>;
  }>;
  voucher?: {
    code: string;
    amount: number;
    currency: string;
    status: "active" | "redeemed" | "expired";
    paymentRoute: Array<{ step: number; label: string; completed: boolean }>;
  };
  delivery?: {
    trackingId: string;
    status: "pending" | "in_transit" | "delivered";
    eta?: string;
    steps: Array<{ label: string; completed: boolean; timestamp?: string | null }>;
  };
}

export interface DashboardData {
  finance: FinanceViewModel | null;
  trade: TradeViewModel | null;
  identity: IdentityViewModel | null;
  inputs: InputsViewModel | null;
  applicationStatus: string;
  score: number | null;
  eligibility: string | null;
}

function mapLandEvidence(items: LandEvidenceItem[] | undefined) {
  return items?.map((item) => ({
    name: item.name,
    type: item.type,
    verified: item.verified,
  }));
}

function mapYieldHistory(items: YieldHistoryEntry[] | undefined) {
  return items?.map((item) => ({
    year: item.year,
    yieldTHa: item.yieldTHa,
    crop: item.crop,
  }));
}

function mapCompliance(items: ComplianceItem[] | undefined) {
  return items?.map((item) => ({
    key: item.key,
    label: item.label,
    passed: item.passed,
  }));
}

function mapIdentityModule(identity: IdentityModule | null | undefined): IdentityViewModel | null {
  if (!identity?.fullName && !identity?.farmerId) return null;

  return {
    fullName: identity.fullName ?? "",
    region: identity.region,
    district: identity.district ?? "",
    gender: identity.gender ?? "",
    kycStatus: identity.kycStatus ?? "",
    farmSizeHa: identity.farmSizeHa ?? "",
    landOwnership: identity.landOwnership ?? "",
    hasGisMapping: identity.hasGisMapping ?? false,
    documentCompleteness: identity.documentCompleteness ?? 0,
    farmerId: identity.farmerId,
    farmName: identity.farmName,
    ekyc: identity.ekyc,
    gis: identity.gis,
    landEvidence: mapLandEvidence(identity.landEvidence),
    yieldHistory: mapYieldHistory(identity.yieldHistory),
    compliance: mapCompliance(identity.compliance),
  };
}

function mapFinanceModule(finance: FinanceModule | null | undefined): FinanceViewModel | null {
  if (!finance?.caseId) return null;

  const stages = (finance.stages ?? []).map((stage) => ({
    label: stage.label ?? "",
    completed: stage.completed ?? false,
    timestamp: stage.timestamp,
  }));

  const scoringComplete = stages.some(
    (s) => s.completed && /scoring|baholash|оценк/i.test(s.label),
  );

  return {
    purpose: finance.purpose ?? "",
    amount: finance.amount ?? "",
    existingLoans: finance.existingLoans ?? "",
    monthlyIncome: finance.monthlyIncome ?? "",
    repaymentHistory: finance.repaymentHistory ?? "",
    caseId: finance.caseId,
    status: finance.status ?? "pending",
    stages,
    riskPd: finance.riskPd,
    riskRating: finance.riskRating,
    ifrs9Stage: finance.ifrs9Stage,
    cbuClass: finance.cbuClass,
    farmerExplanation: finance.farmerExplanation,
    satelliteImages: finance.satelliteImages,
    scoringComplete: scoringComplete || finance.riskPd != null,
    eligibilityScore: finance.eligibilityScore,
    eligibilityLabel: finance.eligibilityLabel,
    routedInstitution: finance.routedInstitution,
    sla: finance.sla,
    bankMatches: finance.bankMatches,
    documents: finance.documents,
  };
}

function mapInputsModule(inputs: InputsModule | null | undefined): InputsViewModel | null {
  if (!inputs) return null;

  return {
    assets: (inputs.assets ?? []).map((a) => ({
      assetType: a.assetType ?? "",
      description: "",
      estimatedValue: a.estimatedValue != null ? String(a.estimatedValue) : "",
      condition: a.condition ?? "",
    })),
    recommendedInputs: (inputs.recommendedInputs ?? []).map((r) => ({
      name: r.name ?? "",
      category: r.category ?? "",
      relevance: r.relevance ?? "",
    })),
    kpis: inputs.kpis,
    suppliers: inputs.suppliers,
    catalog: inputs.catalog,
    voucher: inputs.voucher,
    delivery: inputs.delivery,
  };
}

export function mapDashboardResponse(
  payload: FarmerDashboardResponse | Record<string, unknown>,
): DashboardData {
  const finance = mapFinanceModule(payload.finance as FinanceModule | null | undefined);

  return {
    finance,
    trade: (payload.trade as TradeViewModel | null) ?? null,
    identity: mapIdentityModule(payload.identity as IdentityModule | null | undefined),
    inputs: mapInputsModule(payload.inputs as InputsModule | null | undefined),
    applicationStatus: String(payload.applicationStatus ?? "none"),
    score: payload.score != null ? Number(payload.score) : null,
    eligibility: payload.eligibility != null ? String(payload.eligibility) : null,
  };
}
