/** SSH sessions and the interactive terminal. The SSH connection itself lives in the Rust Core. */
import { call, send, subscribe } from "../transport";
import type { Result, SessionStatus, SshConnectRequest, SshTrustRequest } from "../types";

export const ssh = Object.freeze({
  list: () => call<SessionStatus[]>("core_ssh_list", "ssh:list"),
  connect: (payload: SshConnectRequest) => call<Result<SessionStatus>>("core_ssh_connect", "ssh:connect", payload),
  trustHostKey: (payload: SshTrustRequest) => call<Result<{ host: string; port: number; fingerprint: string }>>("core_ssh_trust_host_key", "ssh:trustHostKey", payload),
  disconnect: (sessionId: string) => call<Result<{ disconnected: boolean }>>("core_ssh_disconnect", "ssh:disconnect", { sessionId }),
  resize: (sessionId: string, cols: number, rows: number) => call<Result<{ cols: number; rows: number }>>("core_ssh_resize", "ssh:resize", { sessionId, cols, rows }),
  input: (sessionId: string, data: string) => send("core_ssh_input", { sessionId, data }),
  onData: (callback: (event: { sessionId: string; data: string }) => void) => subscribe("ssh:data", callback),
  onState: (callback: (event: SessionStatus) => void) => subscribe("ssh:state", callback),
  onError: (callback: (event: { sessionId?: string; code?: string; message: string }) => void) => subscribe("ssh:error", callback)
});
