import { describe, expect, it } from "vitest";
import { mapDashboardResponse } from "@/lib/farmer-dashboard";

describe("mapDashboardResponse", () => {
  it("maps a full payload", () => {
    const payload = {
      finance: { purpose: "equipment", amount: "5000", existingLoans: "0", monthlyIncome: "800", repaymentHistory: "good", caseId: "c1", status: "pending", stages: [] },
      trade: { crops: [], buyerMatches: [], exportDocsComplete: false },
      identity: { fullName: "Test", district: "Tashkent", gender: "M", kycStatus: "verified", farmSizeHa: "2", landOwnership: "owned", hasGisMapping: true, documentCompleteness: 80 },
      inputs: { assets: [], recommendedInputs: [] },
      applicationStatus: "submitted",
      score: 72,
      eligibility: "eligible",
    };

    const result = mapDashboardResponse(payload);

    expect(result.finance).toMatchObject(payload.finance);
    expect(result.trade).toMatchObject(payload.trade!);
    expect(result.identity).toMatchObject(payload.identity!);
    expect(result.inputs).toMatchObject(payload.inputs!);
    expect(result.applicationStatus).toBe("submitted");
    expect(result.score).toBe(72);
    expect(result.eligibility).toBe("eligible");
  });

  it("defaults missing nested objects to null", () => {
    const result = mapDashboardResponse({});

    expect(result.finance).toBeNull();
    expect(result.trade).toBeNull();
    expect(result.identity).toBeNull();
    expect(result.inputs).toBeNull();
    expect(result.applicationStatus).toBe("none");
    expect(result.score).toBeNull();
    expect(result.eligibility).toBeNull();
  });

  it("coerces score and eligibility when present", () => {
    const result = mapDashboardResponse({
      score: "85",
      eligibility: 1,
      applicationStatus: undefined,
    });

    expect(result.score).toBe(85);
    expect(result.eligibility).toBe("1");
    expect(result.applicationStatus).toBe("none");
  });

  it("preserves explicit null score and eligibility", () => {
    const result = mapDashboardResponse({
      score: null,
      eligibility: null,
      applicationStatus: "in_review",
    });

    expect(result.score).toBeNull();
    expect(result.eligibility).toBeNull();
    expect(result.applicationStatus).toBe("in_review");
  });
});
