import { describe, expect, it } from "bun:test";
import type { FirstTarget } from "@/lib/onboarding/first-target";
import { createTargetStepHandlers } from "./target-step-logic";

const TARGET: FirstTarget = { keywordId: "k1", country: "FR" };

function setup(setTarget: () => Promise<void>) {
  const calls: unknown[][] = [];
  const errors: string[] = [];
  let done = 0;
  const handlers = createTargetStepHandlers({
    setTarget: (...args) => {
      calls.push(args);
      return setTarget();
    },
    onDone: () => {
      done += 1;
    },
    onError: (m) => errors.push(m),
    failedMessage: "échec",
  });
  return { handlers, calls, errors, doneCount: () => done };
}

describe("createTargetStepHandlers", () => {
  it("écrit le statut planned puis laisse l'appelant quitter", async () => {
    const s = setup(async () => {});
    await s.handlers.plan(TARGET);
    // Le statut `planned` n'est pas décoratif : c'est lui qui déclenche l'ajout
    // du stage `planning` dans l'action serveur.
    expect(s.calls).toEqual([["k1", "FR", "planned"]]);
    expect(s.doneCount()).toBe(1);
    expect(s.errors).toEqual([]);
  });

  it("n'écrit rien et ne quitte pas sans candidat", async () => {
    const s = setup(async () => {});
    await s.handlers.plan(null);
    expect(s.calls).toEqual([]);
    expect(s.doneCount()).toBe(0);
  });

  it("affiche le refus et NE quitte PAS quand l'écriture lève", async () => {
    // Quitter ici ramènerait sur la même étape en détruisant le message : rien
    // n'a été écrit, `target-country` est toujours faux.
    const s = setup(async () => {
      throw new Error("no active organization");
    });
    await s.handlers.plan(TARGET);
    expect(s.doneCount()).toBe(0);
    expect(s.errors).toEqual(["échec"]);
  });
});
