export const DEPLOYMENT_MODES = ["default", "production", "dogfood"] as const;
export type DeploymentMode = (typeof DEPLOYMENT_MODES)[number];

export const DOGFOOD_NATIVE_ACP_INJECTIONS = ["fail-after-prompt-on-initial"] as const;
export type DogfoodNativeAcpInjection = (typeof DOGFOOD_NATIVE_ACP_INJECTIONS)[number];

export interface DeploymentConfig {
  readonly mode: DeploymentMode;
  readonly nativeAcpInjection?: DogfoodNativeAcpInjection;
}

const MODE_KEY = "AWP_DEPLOYMENT_MODE";
const INJECTION_KEY = "AWP_DOGFOOD_NATIVE_ACP_FAIL_AFTER_PROMPT_ON_INITIAL";

export function parseDeploymentConfig(
  env: Readonly<Record<string, string | undefined>>,
  options: { readonly nativeAcpEnabled: boolean },
): DeploymentConfig {
  const rawMode = env[MODE_KEY];
  const mode: DeploymentMode = rawMode === undefined ? "default" : parseMode(rawMode);
  const rawInjection = env[INJECTION_KEY];

  if (rawInjection === undefined) return { mode };
  if (rawInjection !== "1") {
    throw new Error(`${INJECTION_KEY} must be exactly 1 when configured`);
  }
  if (mode !== "dogfood") {
    throw new Error(`${INJECTION_KEY} is permitted only when ${MODE_KEY}=dogfood`);
  }
  if (!options.nativeAcpEnabled) {
    throw new Error(`${INJECTION_KEY} requires AWP_NATIVE_ACP_ENABLED=1`);
  }

  return { mode, nativeAcpInjection: "fail-after-prompt-on-initial" };
}

export function serializeNativeAcpInjection(
  config: DeploymentConfig,
): Readonly<Record<string, string>> {
  if (config.mode !== "dogfood" || config.nativeAcpInjection === undefined) return {};
  if (config.nativeAcpInjection !== "fail-after-prompt-on-initial") {
    throw new Error("Unsupported dogfood native ACP injection");
  }
  return { [INJECTION_KEY]: "1" };
}

export function nativeAcpRunnerCommand(config: DeploymentConfig): readonly string[] | undefined {
  const injectionEnvironment = serializeNativeAcpInjection(config);
  if (Object.keys(injectionEnvironment).length === 0) return undefined;
  return [
    "env",
    ...Object.entries(injectionEnvironment).map(([key, value]) => `${key}=${value}`),
    "node",
    "/opt/awp-agent-runner/runner.mjs",
  ];
}

export function nativeAcpRunnerCommandFromEnvironment(
  env: Readonly<Record<string, string | undefined>>,
  options: { readonly nativeAcpEnabled: boolean },
): readonly string[] | undefined {
  return nativeAcpRunnerCommand(parseDeploymentConfig(env, options));
}

function parseMode(value: string): DeploymentMode {
  if ((DEPLOYMENT_MODES as readonly string[]).includes(value)) return value as DeploymentMode;
  throw new Error(`${MODE_KEY} must be one of: ${DEPLOYMENT_MODES.join(", ")}`);
}
