import type { ExecResult } from "../ssh";

export type DeployMethod = "systemd" | "docker" | "pm2" | "manual";

export const DEPLOY_METHODS: DeployMethod[] = ["systemd", "docker", "pm2", "manual"];

export const DEPLOY_LABEL: Record<DeployMethod, string> = {
  systemd: "systemd",
  docker: "Docker",
  pm2: "PM2",
  manual: "Thủ công",
};

export const DEPLOY_DESCRIPTION: Record<DeployMethod, string> = {
  systemd: "Quản lý qua systemd unit (mặc định cho managed install).",
  docker: "Container Docker đã chạy trên host (cần tên container).",
  pm2: "Process pm2 đã chạy (cần tên process).",
  manual: "Khởi chạy thủ công — AM chỉ probe version + tail log file.",
};

export type StrategyCtx = {
  hostId: string;
  /** Tên unit/container/process. Cho systemd nếu rỗng → fallback agent-<name>.service. */
  ref: string;
  /** Lệnh đọc version (đã shell-quoted), ví dụ "opencode --version 2>&1 | head -1". */
  versionProbe: string;
};

export type StrategyResult = {
  ok: boolean;
  log: string;
  version?: string;
  pid?: number;
  running?: boolean;
  uptimeSec?: number;
  restartCount?: number;
};

export type DeployStrategy = {
  status(ctx: StrategyCtx): Promise<StrategyResult>;
  start(ctx: StrategyCtx): Promise<StrategyResult>;
  stop(ctx: StrategyCtx): Promise<StrategyResult>;
  restart(ctx: StrategyCtx): Promise<StrategyResult>;
  logs(ctx: StrategyCtx, lines?: number): Promise<StrategyResult>;
  uninstall(ctx: StrategyCtx): Promise<StrategyResult>;
};

export function fmtExec(label: string, r: ExecResult): string {
  return `==> ${label}\n${(r.stdout || r.stderr).trimEnd()}\n(exit ${r.code})`;
}

/** Resolve deployRef khi user để trống — chỉ áp dụng cho systemd, các method khác bắt buộc nhập. */
export function resolveRef(method: DeployMethod, ref: string, agentName: string): string {
  if (ref) return ref;
  if (method === "systemd") return `agent-${agentName}.service`;
  return "";
}
