import type { DiscoveredControl } from "./types.js";

export type TerminalInteractionCoverageKind =
  | "unknown-terminal-state"
  | "unknown-idempotency"
  | "satisfied-terminal-state";

export type TerminalBooleanAxis = "aria-pressed" | "aria-checked" | "aria-selected";

const TERMINAL_BOOLEAN_AXES: TerminalBooleanAxis[] = [
  "aria-pressed",
  "aria-checked",
  "aria-selected",
];

const IDEMPOTENT_ACTIVATION_MARKER = "aria-keyshortcuts";
const IDEMPOTENT_TERMINAL_CLAIM_MARKER = "aria-details";
const TERMINAL_ACTIVE_MARKER = "aria-current";

export type IdempotentTerminalAssessment =
  | { kind: "requires-activation" }
  | { kind: "satisfied-terminal"; axis: TerminalBooleanAxis; value: "true" | "false" }
  | { kind: "unknown-terminal"; reason: "unknown-terminal-state" }
  | { kind: "unknown-idempotency"; reason: "unknown-idempotency" };

const booleanStateValue = (value: string | undefined): value is "true" | "false" =>
  value === "true" || value === "false";

function declaredBooleanAxis(control: DiscoveredControl): TerminalBooleanAxis | undefined {
  return TERMINAL_BOOLEAN_AXES.find((axis) => control.stateSchema.includes(axis));
}

function observedBooleanState(
  control: DiscoveredControl,
  axis: TerminalBooleanAxis,
): string | undefined {
  if (axis === "aria-pressed") return control.ariaPressed;
  return control.current ? "true" : "false";
}

function declaredTerminalValue(control: DiscoveredControl): "true" | "false" | undefined {
  if (control.stateSchema.includes(TERMINAL_ACTIVE_MARKER)) return "true";
  if (control.stateSchema.includes(IDEMPOTENT_ACTIVATION_MARKER)) return "false";
  return undefined;
}

export function assessIdempotentTerminalState(
  control: DiscoveredControl,
): IdempotentTerminalAssessment {
  const axis = declaredBooleanAxis(control);
  const idempotentProven = control.stateSchema.includes(IDEMPOTENT_ACTIVATION_MARKER);
  const idempotentClaimed = control.stateSchema.includes(IDEMPOTENT_TERMINAL_CLAIM_MARKER);

  if (idempotentClaimed && !idempotentProven) {
    return { kind: "unknown-idempotency", reason: "unknown-idempotency" };
  }
  if (idempotentProven && axis === undefined) {
    return { kind: "unknown-terminal", reason: "unknown-terminal-state" };
  }
  if (axis === undefined) {
    return { kind: "requires-activation" };
  }

  const observed = observedBooleanState(control, axis);
  if (!booleanStateValue(observed)) {
    return idempotentProven
      ? { kind: "unknown-terminal", reason: "unknown-terminal-state" }
      : { kind: "requires-activation" };
  }

  const terminal = declaredTerminalValue(control);
  if (terminal === undefined) {
    return idempotentProven
      ? { kind: "unknown-terminal", reason: "unknown-terminal-state" }
      : { kind: "requires-activation" };
  }
  if (!idempotentProven) {
    return { kind: "requires-activation" };
  }
  if (observed === terminal) {
    return { kind: "satisfied-terminal", axis, value: observed };
  }
  return { kind: "requires-activation" };
}
