import { describe, expect, it } from "vitest";
import { buildIntentFromText, getWorkClarificationPrompt } from "@/lib/intent";

describe("work intent parsing", () => {
  it("extracts planning constraints from natural language", () => {
    const parsed = buildIntentFromText(
      "Prevois 6h en blocs de 90 minutes pour le dossier alpha avant 2026-04-20 entre 10h et 16h, pas mercredi, en mode compact",
      "work"
    );

    expect(parsed.intent).toBe("plan_work_blocks");
    if (parsed.intent !== "plan_work_blocks") {
      throw new Error("Expected work intent");
    }

    expect(parsed.total_effort_minutes).toBe(360);
    expect(parsed.preferred_block_minutes).toBe(90);
    expect(parsed.constraints.strategy).toBe("compact");
    expect(parsed.constraints.work_day_start_hour).toBe(10);
    expect(parsed.constraints.work_day_end_hour).toBe(16);
    expect(parsed.constraints.excluded_weekdays).toContain(3);
  });

  it("defaults to spread strategy with standard workdays", () => {
    const parsed = buildIntentFromText(
      "J'ai une deadline 2026-05-10 pour finaliser la presentation",
      "work"
    );

    expect(parsed.intent).toBe("plan_work_blocks");
    if (parsed.intent !== "plan_work_blocks") {
      throw new Error("Expected work intent");
    }

    expect(parsed.constraints.strategy).toBe("spread");
    expect(parsed.constraints.work_day_start_hour).toBe(9);
    expect(parsed.constraints.work_day_end_hour).toBe(18);
    expect(parsed.constraints.excluded_weekdays).toEqual([0, 6]);
  });

  it("returns a concise clarification prompt when key fields are missing", () => {
    const clarification = getWorkClarificationPrompt("Planifie du travail pour mon dossier");

    expect(clarification).not.toBeNull();
    expect(clarification?.missing_fields).toContain("deadline");
    expect(clarification?.missing_fields).toContain("charge_estimee");
    expect(clarification?.missing_fields).toContain("duree_bloc");
  });

  it("detects weekly cadence and computes total workload until deadline", () => {
    const parsed = buildIntentFromText(
      "Planifie 1h par semaine jusque fin avril pour terminer le projet de Geoffroy",
      "work"
    );

    expect(parsed.intent).toBe("plan_work_blocks");
    if (parsed.intent !== "plan_work_blocks") {
      throw new Error("Expected work intent");
    }

    expect(parsed.cadence_type).toBe("weekly");
    expect(parsed.cadence_per_week_target_minutes).toBe(60);
    expect(parsed.total_effort_minutes).toBeGreaterThanOrEqual(60);
    expect(parsed.deadline).toContain("T");
  });

  it("uses context hints to infer preferred days when absent from prompt", () => {
    const parsed = buildIntentFromText(
      "Planifie le travail pour la livraison",
      "work",
      {
        summary: "Le suivi se fait le mardi et jeudi",
        highlights: ["Points hebdo mardi et jeudi"]
      }
    );

    expect(parsed.intent).toBe("plan_work_blocks");
    if (parsed.intent !== "plan_work_blocks") {
      throw new Error("Expected work intent");
    }

    expect(parsed.preferred_days.length).toBeGreaterThan(0);
  });
});
