// Types REST partagés (préfixe /api/v1).
import type { PostCreateHook, RepoSummary, SessionSummary, WorktreeSummary } from './protocol.js';

export interface ApiError {
  error: { code: string; message: string; details?: unknown };
}

export interface LoginRequest {
  token: string;
}
export interface LoginResponse {
  ok: true;
  label: string;
}
export interface MeResponse {
  ok: true;
  tokenLabel: string;
  serverVersion: string;
}

export interface CreateSessionRequest {
  cwd: string;
  /** binaire à lancer — défaut "claude" ; "bash" sert aux tests d'acceptation sans quota */
  command?: 'claude' | 'bash';
}
export interface SessionsListResponse {
  sessions: SessionSummary[];
}
export interface SessionResponse {
  session: SessionSummary;
}

// POST /sessions/:id/resume et /sessions/:id/fork (P2) : aucun corps — cwd et command
// sont TOUJOURS dérivés du :id (lu sur disque), jamais fournis par le client (cf. spike S1).
export type ResumeSessionRequest = Record<string, never>;
export type ForkSessionRequest = Record<string, never>;

// ---- Repos & worktrees (P3) ----
export interface ReposListResponse {
  repos: RepoSummary[];
}
export interface RepoResponse {
  repo: RepoSummary;
}
export interface CreateRepoRequest {
  path: string;
  label?: string;
  postCreateHooks?: PostCreateHook[];
  preTrust?: boolean;
}
export interface UpdateRepoRequest {
  label?: string;
  postCreateHooks?: PostCreateHook[];
  preTrust?: boolean;
}

export interface WorktreesListResponse {
  worktrees: WorktreeSummary[];
}
export interface WorktreeResponse {
  worktree: WorktreeSummary;
}
export interface HookRunResult {
  hookId: string;
  label: string;
  exitCode: number | null;
  output: string;
  durationMs: number;
}
export interface CreateWorktreeRequest {
  branch: string;
  /** true : créer la branche (`-b`) ; false : checkout d'une branche existante. */
  newBranch: boolean;
  /** point de départ de la nouvelle branche (défaut : HEAD courant du repo). */
  baseRef?: string;
  /** chemin cible du worktree (défaut : `<parent>/<repo>-wt-<branch>`). */
  path?: string;
  runHooks?: boolean;
  preTrust?: boolean;
  /** lancer une session dans le worktree créé (défaut : aucune). */
  startSession?: 'claude' | 'bash' | null;
}
export interface CreateWorktreeResponse {
  worktree: WorktreeSummary;
  hookResults: HookRunResult[];
  session: SessionSummary | null;
}
export interface AdoptWorktreeRequest {
  path: string;
  runHooks?: boolean;
  preTrust?: boolean;
}

// ---- Navigateur de répertoires (sélecteur de dossier côté web) ----
export interface FsEntry {
  name: string;
  /** chemin absolu du dossier */
  path: string;
  /** présent (true) uniquement en mode markRepos quand le dossier est un dépôt git */
  isRepo?: boolean;
}
export interface FsListResponse {
  /** chemin absolu listé (normalisé) */
  path: string;
  /** parent (null à la racine `/`) — pour le bouton « remonter » */
  parent: string | null;
  /** home de l'utilisateur côté serveur — point de départ par défaut */
  home: string;
  /** sous-dossiers uniquement, triés sans tenir compte de la casse */
  entries: FsEntry[];
}

// ---- Web Push (P4) ----
export interface VapidKeyResponse {
  /** clé publique VAPID (applicationServerKey côté navigateur). */
  key: string;
}
export interface PushSubscribeRequest {
  endpoint: string;
  keys: { p256dh: string; auth: string };
}
export interface PushUnsubscribeRequest {
  endpoint: string;
}
