/**
 * Registry of BFF API flows for E2E validation and DB/API sync checks.
 * Maps OpenAPI operation → handler → expected DB entities (core-api).
 */

export interface ApiFlowStep {
  id: string;
  phase: string;
  method: string;
  path: string;
  description: string;
  /** Prisma models touched when using live core-api */
  dbEntities?: string[];
  /** OpenAPI schema component for response validation */
  responseSchema?: string;
}

export const SYSTEM_FUNCTIONAL_FLOW: ApiFlowStep[] = [
  { id: "F01", phase: "auth", method: "POST", path: "/api/auth/otp", description: "Send OTP to farmer phone", responseSchema: "OtpSentResponse" },
  { id: "F02", phase: "auth", method: "POST", path: "/api/auth/verify", description: "Verify OTP → JWT cookie", dbEntities: ["User"], responseSchema: "VerifyResponse" },
  { id: "F03", phase: "auth", method: "GET", path: "/api/auth/me", description: "Load authenticated user + active session", dbEntities: ["User", "OnboardingSession"], responseSchema: "UserMeResponse" },
  { id: "F04", phase: "onboarding", method: "POST", path: "/api/onboarding", description: "Create or resume onboarding session", dbEntities: ["OnboardingSession"], responseSchema: "OnboardingSession" },
  { id: "F05", phase: "onboarding", method: "GET", path: "/api/onboarding/{id}", description: "Fetch session with stepData", dbEntities: ["OnboardingSession"], responseSchema: "OnboardingSession" },
  { id: "F06", phase: "onboarding", method: "PATCH", path: "/api/onboarding/{id}/steps/{step}", description: "Persist step payload → stepData + normalized tables", dbEntities: ["OnboardingSession", "OnboardingStepRecord", "FarmerProfile", "LandParcel", "CropPlan", "FarmAsset", "Document"], responseSchema: "OnboardingSession" },
  { id: "F07", phase: "onboarding", method: "POST", path: "/api/onboarding/{id}/submit", description: "Submit for scoring → status=scoring", dbEntities: ["OnboardingSession"], responseSchema: "OnboardingSession" },
  { id: "F08", phase: "scoring", method: "GET", path: "/api/onboarding/{id}/status", description: "Poll scoringPhase, score, scoringMeta", dbEntities: ["ScoringRun", "FinanceCase", "ScoringAudit"], responseSchema: "OnboardingStatusResponse" },
  { id: "F09", phase: "scoring", method: "GET", path: "/api/scoring/satellite-image", description: "Proxy NASA GIBS thumbnail (allowlist)", responseSchema: "binary" },
  { id: "F10", phase: "dashboard", method: "GET", path: "/api/farmer/dashboard", description: "Finance module with riskPd, cbuClass", dbEntities: ["FinanceCase", "ScoringRun"], responseSchema: "FarmerDashboardResponse" },
  { id: "F11", phase: "reference", method: "GET", path: "/api/reference/options", description: "Localized reference catalog", dbEntities: ["ReferenceOption"], responseSchema: "ReferenceOption[]" },
  { id: "F12", phase: "documents", method: "POST", path: "/api/documents/upload", description: "Multipart document upload", dbEntities: ["Document"], responseSchema: "DocumentUploadResponse" },
  { id: "F13", phase: "internal", method: "POST", path: "worker:/api/analyze", description: "Agri-Access worker scoring (internal)", responseSchema: "AgriAccessAnalyzeResponse" },
  { id: "F14", phase: "internal", method: "GET", path: "worker:/api/model-status", description: "Worker health probe", responseSchema: "ModelStatusResponse" },
  { id: "F15", phase: "internal", method: "POST", path: "core:/onboarding/{id}/submit", description: "Core-api scoring orchestration", dbEntities: ["ScoringRun", "ScoringAudit", "FinanceCase"], responseSchema: "OnboardingSession" },
  { id: "F16", phase: "dashboard", method: "GET", path: "/api/farmer/dashboard", description: "Identity module enrich — farmerId, ekyc, gis, landEvidence, yieldHistory, compliance", dbEntities: ["FarmerProfile", "KycRecord", "LandParcel", "Document", "YieldHistory", "EligibilityRuleResult"], responseSchema: "IdentityModuleV2" },
  { id: "F17", phase: "dashboard", method: "GET", path: "/api/farmer/dashboard", description: "Finance module enrich — eligibilityScore, routedInstitution, sla, bankMatches, documents, stages", dbEntities: ["FinanceCase", "ScoringRun", "InstitutionMatch", "Document"], responseSchema: "FinanceModuleV2" },
  { id: "F18", phase: "dashboard", method: "GET", path: "/api/farmer/dashboard", description: "Inputs module enrich — kpis, suppliers, catalog, voucher, delivery", dbEntities: ["CatalogAggregate", "Supplier", "ProductCatalog", "InputVoucher", "DeliveryShipment"], responseSchema: "InputsModuleV2" },
];

/** DB column ↔ API field sync matrix (key scoring fields). */
export const DB_API_SYNC_MATRIX = [
  { db: "ScoringRun.totalScore", api: "OnboardingStatusResponse.score", transform: "0–1000 integer" },
  { db: "ScoringRun.decision", api: "OnboardingStatusResponse.eligibilityOutcome", transform: "eligible|conditional|not_eligible" },
  { db: "ScoringRun.rulesResult.reasonCodes", api: "OnboardingStatusResponse.reasonCodes", transform: "RC_* array" },
  { db: "ScoringRun.rulesResult.scoringMeta", api: "OnboardingStatusResponse.scoringMeta", transform: "nested object" },
  { db: "FinanceCase.publicCaseId", api: "OnboardingStatusResponse.financeCaseId", transform: "AGN-FIN-*" },
  { db: "FinanceCase.status", api: "OnboardingStatusResponse.financeCaseStatus", transform: "enum" },
  { db: "OnboardingSession.stepData.SCORING", api: "StepScoringData", transform: "wizard persist" },
  { db: "ScoringAudit.inputSnapshotHash", api: "—", transform: "SHA-256 of stepData (immutable)" },
  { db: "ScoringAudit.outputSnapshot", api: "scoringMeta (redacted)", transform: "append-only audit" },
  { db: "FinanceCase.notes (JSON)", api: "FinanceModule.riskPd/riskRating", transform: "dashboard enrich" },
  { db: "FarmerProfile.publicFarmerId", api: "identity.farmerId", transform: "AGID-FMR-*" },
  { db: "FarmerProfile.displayName", api: "identity.farmName", transform: "string" },
  { db: "KycRecord.photoUrl", api: "identity.ekyc.photoUrl", transform: "uri" },
  { db: "KycRecord.dob", api: "identity.ekyc.dob", transform: "YYYY-MM-DD" },
  { db: "KycRecord.pinflMasked", api: "identity.ekyc.aadhaarMasked", transform: "masked PII" },
  { db: "User.phone", api: "identity.ekyc.mobileMasked", transform: "masked phone" },
  { db: "LandParcel.geometry", api: "identity.gis.polygonGeoJson", transform: "GeoJSON Polygon" },
  { db: "LandParcel.areaHa", api: "identity.gis.areaHa", transform: "number" },
  { db: "LandParcel.centroid", api: "identity.gis.lat/lng", transform: "WGS84" },
  { db: "Document[] (land)", api: "identity.landEvidence[]", transform: "name,type,verified" },
  { db: "YieldHistory", api: "identity.yieldHistory[]", transform: "year,yieldTHa,crop" },
  { db: "EligibilityRuleResult[]", api: "identity.compliance[]", transform: "key,label,passed" },
  { db: "ScoringRun.totalScore", api: "finance.eligibilityScore", transform: "normalized /100" },
  { db: "FinanceCase.routedInstitution", api: "finance.routedInstitution", transform: "name,priority,isBestMatch" },
  { db: "FinanceCase.slaDueAt", api: "finance.sla", transform: "remainingHours,totalHours,dueAt" },
  { db: "InstitutionMatch[]", api: "finance.bankMatches[]", transform: "name,score,status" },
  { db: "Document[] (finance)", api: "finance.documents[]", transform: "name,status" },
  { db: "FinanceCase.statusHistory", api: "finance.stages[]", transform: "label,completed" },
  { db: "CatalogAggregate", api: "inputs.kpis", transform: "seed,fertiliser,equipment,vouchers,inTransit" },
  { db: "Supplier.rating", api: "inputs.suppliers[]", transform: "name,logoUrl,rating" },
  { db: "ProductCatalog", api: "inputs.catalog[]", transform: "category,items" },
  { db: "InputVoucher", api: "inputs.voucher", transform: "VoucherDetail" },
  { db: "DeliveryShipment", api: "inputs.delivery", transform: "DeliveryTracking" },
] as const;
