import { describe, expect, it } from "vitest";

import { detectPermissiveBashFallback } from "#src/config-loader";
import type { FlatPermissionConfig } from "#src/types";

describe("detectPermissiveBashFallback", () => {
  it("warns when top-level '*' is allow and bash is absent", () => {
    const permission: FlatPermissionConfig = { "*": "allow" };

    const issue = detectPermissiveBashFallback(permission);

    expect(issue).toBeDefined();
    expect(issue).toContain("bash");
    expect(issue).toContain("allow");
  });

  it("warns when top-level '*' is allow and bash map has no '*' key", () => {
    const permission: FlatPermissionConfig = {
      "*": "allow",
      bash: { "git *": "ask" },
    };

    expect(detectPermissiveBashFallback(permission)).toBeDefined();
  });

  it("does not warn when bash is a bare string surface", () => {
    const permission: FlatPermissionConfig = { "*": "allow", bash: "ask" };

    expect(detectPermissiveBashFallback(permission)).toBeUndefined();
  });

  it("does not warn when bash map has an explicit '*' key", () => {
    const permission: FlatPermissionConfig = {
      "*": "allow",
      bash: { "*": "ask", "git *": "allow" },
    };

    expect(detectPermissiveBashFallback(permission)).toBeUndefined();
  });

  it("does not warn when top-level '*' is not allow", () => {
    const permission: FlatPermissionConfig = { "*": "ask" };

    expect(detectPermissiveBashFallback(permission)).toBeUndefined();
  });

  it("does not warn when top-level '*' is absent", () => {
    const permission: FlatPermissionConfig = { bash: { "git *": "ask" } };

    expect(detectPermissiveBashFallback(permission)).toBeUndefined();
  });

  it("does not warn when permission is undefined", () => {
    expect(detectPermissiveBashFallback(undefined)).toBeUndefined();
  });
});
