import { describe, expect, it } from "vitest";
import type { ClawdbotConfig } from "../config/config.js";
import { resolveAgentConfig } from "./agent-scope.js";

describe("resolveAgentConfig", () => {
  it("should return undefined when no agents config exists", () => {
    const cfg: ClawdbotConfig = {};
    const result = resolveAgentConfig(cfg, "main");
    expect(result).toBeUndefined();
  });

  it("should return undefined when agent id does not exist", () => {
    const cfg: ClawdbotConfig = {
      routing: {
        agents: {
          main: { workspace: "~/clawd" },
        },
      },
    };
    const result = resolveAgentConfig(cfg, "nonexistent");
    expect(result).toBeUndefined();
  });

  it("should return basic agent config", () => {
    const cfg: ClawdbotConfig = {
      routing: {
        agents: {
          main: {
            name: "Main Agent",
            workspace: "~/clawd",
            agentDir: "~/.clawdbot/agents/main",
            model: "anthropic/claude-opus-4",
          },
        },
      },
    };
    const result = resolveAgentConfig(cfg, "main");
    expect(result).toEqual({
      name: "Main Agent",
      workspace: "~/clawd",
      agentDir: "~/.clawdbot/agents/main",
      model: "anthropic/claude-opus-4",
      sandbox: undefined,
      tools: undefined,
    });
  });

  it("should return agent-specific sandbox config", () => {
    const cfg: ClawdbotConfig = {
      routing: {
        agents: {
          work: {
            workspace: "~/clawd-work",
            sandbox: {
              mode: "all",
              scope: "agent",
              perSession: false,
              workspaceAccess: "ro",
              workspaceRoot: "~/sandboxes",
              tools: {
                allow: ["read"],
                deny: ["bash"],
              },
            },
          },
        },
      },
    };
    const result = resolveAgentConfig(cfg, "work");
    expect(result?.sandbox).toEqual({
      mode: "all",
      scope: "agent",
      perSession: false,
      workspaceAccess: "ro",
      workspaceRoot: "~/sandboxes",
      tools: {
        allow: ["read"],
        deny: ["bash"],
      },
    });
  });

  it("should return agent-specific tools config", () => {
    const cfg: ClawdbotConfig = {
      routing: {
        agents: {
          restricted: {
            workspace: "~/clawd-restricted",
            tools: {
              allow: ["read"],
              deny: ["bash", "write", "edit"],
            },
          },
        },
      },
    };
    const result = resolveAgentConfig(cfg, "restricted");
    expect(result?.tools).toEqual({
      allow: ["read"],
      deny: ["bash", "write", "edit"],
    });
  });

  it("should return both sandbox and tools config", () => {
    const cfg: ClawdbotConfig = {
      routing: {
        agents: {
          family: {
            workspace: "~/clawd-family",
            sandbox: {
              mode: "all",
              scope: "agent",
            },
            tools: {
              allow: ["read"],
              deny: ["bash"],
            },
          },
        },
      },
    };
    const result = resolveAgentConfig(cfg, "family");
    expect(result?.sandbox?.mode).toBe("all");
    expect(result?.tools?.allow).toEqual(["read"]);
  });

  it("should normalize agent id", () => {
    const cfg: ClawdbotConfig = {
      routing: {
        agents: {
          main: { workspace: "~/clawd" },
        },
      },
    };
    // Should normalize to "main" (default)
    const result = resolveAgentConfig(cfg, "");
    expect(result).toBeDefined();
    expect(result?.workspace).toBe("~/clawd");
  });
});
