import { describe, expect, it } from "vitest";
import type { ConfigurationDefinition, ConfigurationOverride } from "@awp/contracts";
import { ConfigurationRegistry, resolveConfiguration } from "@awp/config";

const definition: ConfigurationDefinition<number> = {
  key: "execution.maxAttempts",
  schemaVersion: 1,
  title: "Maximum attempts",
  description: "Attempt ceiling",
  defaultValue: 1,
  allowedScopes: ["system", "project", "plan", "task", "run"],
  overrideStrategy: "replace",
  mutable: true,
  effectCategory: "future-runs-only",
  sensitiveReferenceOnly: false,
};

describe("configuration foundation", () => {
  it("resolves the narrowest legal scope and preserves provenance", () => {
    const overrides: ConfigurationOverride<number>[] = [
      {
        definitionKey: definition.key,
        scopeType: "project",
        scopeId: "p1",
        value: 2,
        resourceRevision: 1,
        setBy: "human:1",
        setAt: "2026-08-20T00:00:00Z",
      },
      {
        definitionKey: definition.key,
        scopeType: "task",
        scopeId: "t1",
        value: 3,
        resourceRevision: 1,
        setBy: "human:1",
        setAt: "2026-08-20T00:01:00Z",
      },
    ];
    const effective = resolveConfiguration(definition, overrides);
    expect(effective.value).toBe(3);
    expect(effective.sourceScope).toBe("task");
    expect(effective.provenanceChain).toEqual([
      { scopeType: "project", scopeId: "p1" },
      { scopeType: "task", scopeId: "t1" },
    ]);
  });

  it("does not allow duplicate definitions", () => {
    const registry = new ConfigurationRegistry();
    registry.register(definition);
    expect(() => registry.register(definition)).toThrow(/already registered/);
  });
});
