#!/usr/bin/env node
// PreToolUse guard (Bash|PowerShell): блокирует ТОЛЬКО удаление/пересоздание
// БОЕВОЙ базы/кластера Лидерры. Обычную работу (чтение, запросы, тесты на
// отдельной базе, правки через приложение) НЕ трогает.
//
// Повод: 26.06.2026 параллельная сессия выполнила `yc managed-postgresql
// database delete liderra` + recreate на боевом кластере → переналила схему со
// старыми небезопасными RLS-политиками → вход в портал лёг. См. db/CHANGELOG_schema.md v8.57.
//
// Боевая база = Managed PG кластер c9q2cvtjpq3hgq6l0r96 (rw-endpoint *.mdb.yandexcloud.net).
// Тест-база = отдельная liderra_testing (её сносить можно).
//
// Override владельца: маркер `PROD-DESTROY-OK` в самой команде ИЛИ env ALLOW_PROD_DB_DESTROY=1.

import { readFileSync } from 'node:fs';

let raw = '';
try { raw = readFileSync(0, 'utf8'); } catch { /* нет stdin — пропускаем */ }

let cmd = '';
try {
  const j = JSON.parse(raw || '{}');
  cmd = (j.tool_input && (j.tool_input.command ?? j.tool_input.script)) || '';
} catch { /* не JSON — нечего проверять */ }

cmd = String(cmd);

// Явный override владельца — пропускаем.
if (process.env.ALLOW_PROD_DB_DESTROY === '1' || /PROD-DESTROY-OK/.test(cmd)) {
  process.exit(0);
}

const PROD_CLUSTER = 'c9q2cvtjpq3hgq6l0r96';

// Цель — именно ПРОД (а не liderra_testing): по cluster-id, по rw/managed-хосту,
// либо по имени базы `liderra` как отдельному слову (не liderra_testing).
const targetsProd =
  new RegExp(PROD_CLUSTER, 'i').test(cmd) ||
  /\bc-[a-z0-9]+\.(rw|ro)\.mdb\.yandexcloud\.net/i.test(cmd) ||
  /\bliderra\b(?!_)/i.test(cmd);

// Деструктив над управляемой БД/кластером.
const clusterDelete = /managed-postgresql\s+cluster\s+delete/i.test(cmd);       // снос кластера — всегда катастрофа
const databaseDelete = /managed-postgresql\s+database\s+delete/i.test(cmd);     // снос управляемой БД
const dropDatabase = /\bdrop\s+database\b/i.test(cmd);                          // SQL DROP DATABASE

const destructive = clusterDelete || databaseDelete || dropDatabase;

// Снос кластера блокируем всегда; остальное — только если цель = прод.
if (destructive && (clusterDelete || targetsProd)) {
  const reason =
    'ЗАБЛОКИРОВАНО (prod-db-guard): попытка удалить/пересоздать БОЕВУЮ базу/кластер Лидерры. ' +
    'Это снесёт портал (инцидент 26.06.2026). Боевая база = Managed PG кластер ' + PROD_CLUSTER + '. ' +
    'Для тестов используй ОТДЕЛЬНУЮ базу liderra_testing, не прод. ' +
    'Если это осознанное действие ВЛАДЕЛЬЦА — добавь в команду маркер PROD-DESTROY-OK ' +
    'или запусти с env ALLOW_PROD_DB_DESTROY=1.';
  process.stdout.write(JSON.stringify({
    hookSpecificOutput: {
      hookEventName: 'PreToolUse',
      permissionDecision: 'deny',
      permissionDecisionReason: reason,
    },
    systemMessage: reason,
  }));
  process.exit(0);
}

process.exit(0);
