import { query } from "../../db/pool.js";
import { recordAppEvent } from "../../lib/app-log.js";

export interface BackupExecutionRow {
  id: number;
  scope: "manual" | "scheduled" | "pre_deploy" | "restore_test";
  status: "running" | "success" | "failed";
  target: string;
  started_at: string;
  finished_at: string | null;
  operator: string;
  details: Record<string, unknown>;
  created_at: string;
  updated_at: string;
}

export async function listBackupExecutions(limit = 20): Promise<BackupExecutionRow[]> {
  return query<BackupExecutionRow>(`
    SELECT id, scope, status, target, started_at, finished_at, operator, details, created_at, updated_at
    FROM backup_executions
    ORDER BY created_at DESC
    LIMIT $1
  `, [limit]);
}

export async function createBackupExecution(input: {
  scope: BackupExecutionRow["scope"];
  status?: BackupExecutionRow["status"];
  target: string;
  operator?: string;
  details?: Record<string, unknown>;
}): Promise<BackupExecutionRow> {
  const rows = await query<BackupExecutionRow>(`
    INSERT INTO backup_executions (scope, status, target, operator, details)
    VALUES ($1, $2, $3, $4, $5)
    RETURNING id, scope, status, target, started_at, finished_at, operator, details, created_at, updated_at
  `, [
    input.scope,
    input.status ?? "running",
    input.target,
    input.operator ?? "system",
    JSON.stringify(input.details ?? {}),
  ]);
  const item = rows[0]!;
  await recordAppEvent({
    level: item.status === "failed" ? "error" : "info",
    source: "backup.execution",
    message: `Backup ${item.scope} registrado`,
    details: {
      id: item.id,
      scope: item.scope,
      status: item.status,
      target: item.target,
      operator: item.operator,
    },
  });
  return item;
}
