import assert from "node:assert/strict";
import test from "node:test";
import {
  buildWorkflowPortalPreview,
  matchesWorkflowAppliesWhen,
  resolveWorkflowDependentCount,
} from "./workflow-portal-preview.js";

test("matchesWorkflowAppliesWhen honors built-in and generic conditions", () => {
  const factMap = new Map<string, string[]>([
    ["client_marital_status", ["Married"]],
    ["client_has_been_arrested", ["no"]],
    ["client_has_dependents", ["yes"]],
    ["custom_flag", ["true"]],
  ]);

  assert.equal(matchesWorkflowAppliesWhen([], factMap), true);
  assert.equal(matchesWorkflowAppliesWhen(["married"], factMap), true);
  assert.equal(matchesWorkflowAppliesWhen(["divorced"], factMap), false);
  assert.equal(matchesWorkflowAppliesWhen(["has_dependents"], factMap), true);
  assert.equal(matchesWorkflowAppliesWhen(["custom_flag"], factMap), true);
});

test("resolveWorkflowDependentCount prefers numeric fact counts", () => {
  const factMap = new Map<string, string[]>([
    ["client_dependents_count", ["3"]],
    ["client_has_dependents", ["yes"]],
  ]);

  assert.equal(resolveWorkflowDependentCount(factMap), 3);
});

test("buildWorkflowPortalPreview excludes internal prompts and expands dependent documents", () => {
  const preview = buildWorkflowPortalPreview({
    factMap: new Map<string, string[]>([
      ["client_marital_status", ["married"]],
      ["client_has_dependents", ["yes"]],
      ["client_dependents_count", ["2"]],
    ]),
    workflows: [
      {
        workflowTemplateId: "workflow-family",
        workflowName: "Family Case",
        steps: [
          {
            stepName: "Client Intake",
            appliesWhen: [],
            responsePrompts: [
              {
                question: "What is your spouse's full name?",
                targetType: "client",
              },
              {
                question: "Internal note only",
                targetType: "internal",
              },
            ],
          },
        ],
        requiredDocuments: [
          {
            workflowRequiredDocumentId: "marriage-cert",
            documentTypeCode: "marriage_certificate",
            displayName: "Marriage certificate",
            description: null,
            requirementCode: "marriage_certificate",
            minimumQuantity: 1,
            isRequired: true,
            appliesWhen: ["married"],
          },
          {
            workflowRequiredDocumentId: "dependent-passport",
            documentTypeCode: "passport",
            displayName: "Dependent passport",
            description: null,
            requirementCode: "dependent_passport",
            minimumQuantity: 1,
            isRequired: true,
            appliesWhen: ["has_dependents"],
          },
        ],
      },
      {
        workflowTemplateId: "workflow-arrest",
        workflowName: "Arrest Waiver",
        steps: [
          {
            stepName: "Arrest Review",
            appliesWhen: ["arrested"],
            responsePrompts: [
              {
                question: "Describe the arrest history.",
                targetType: "client",
              },
            ],
          },
        ],
        requiredDocuments: [],
      },
    ],
  });

  assert.equal(preview.totals.workflowCount, 2);
  assert.equal(preview.totals.questionCount, 1);
  assert.equal(preview.totals.documentCount, 3);
  assert.equal(preview.totals.actionableWorkflowCount, 1);
  assert.equal(preview.totals.emptyWorkflowCount, 1);
  assert.equal(preview.totals.isEmpty, false);

  assert.equal(preview.questionPlans.length, 1);
  assert.equal(preview.questionPlans[0]?.question, "What is your spouse's full name?");

  assert.equal(preview.documentPlans.length, 2);
  assert.equal(
    preview.documentPlans.find((item) => item.workflowRequiredDocumentId === "dependent-passport")
      ?.requiredCount,
    2,
  );

  const emptyWorkflow = preview.workflows.find((item) => item.workflowTemplateId === "workflow-arrest");
  assert.equal(emptyWorkflow?.isActionable, false);
  assert.equal(emptyWorkflow?.emptyReason, "no_matching_conditions");
});
