import test from "node:test";
import assert from "node:assert/strict";
import { CommandProcessor } from "../src/commands/CommandProcessor.ts";
import { resolveVariables } from "../src/commands/VariableResolver.ts";
import type { ChatMessage } from "../src/types.ts";

const message = (roles: string[] = []): ChatMessage => ({
  event_id: "evt-1",
  channel_id: 4,
  kick_channel_id: "44",
  kick_chatroom_id: "444",
  content: "!discord salut",
  sender: { kick_user_id: "9", username: "Lina", roles },
  created_at: "2026-07-28T00:00:00Z"
});

test("les permissions et cooldowns sont isolés par chaîne et utilisateur", () => {
  const processor = new CommandProcessor();
  const commands = [{
    id: 2,
    name: "discord",
    aliases: ["dc"],
    permission: "moderator" as const,
    enabled: true,
    global_cooldown_seconds: 30,
    user_cooldown_seconds: 30
  }];
  assert.equal(processor.parse(message(), commands).reason, "permission");
  assert.equal(processor.parse(message(["moderator"]), commands).invocation?.name, "discord");
  assert.equal(processor.parse(message(["moderator"]), commands).reason, "global_cooldown");
});

test("les variables sont résolues sans évaluer de code", () => {
  const value = resolveVariables("Salut {user}, nombre {random:2:2}, reste {unknown}", {
    user: "Lina",
    username: "Lina",
    streamer: "FilyX",
    channel: "demo",
    now: new Date("2026-07-28T12:34:00Z")
  }, () => 0);
  assert.match(value, /^Salut Lina, nombre 2, reste \{unknown\}$/);
});

