#!/bin/bash

# PostgreSQL Security Setup Script for CatLink
# This script configures PostgreSQL with security best practices

set -e

echo "🔒 Настройка безопасности PostgreSQL для CatLink..."

# Создаем директорию для конфигурации БД если не существует
mkdir -p database

# Функция для безопасного выполнения SQL команд
execute_sql() {
    docker exec links-db-1 psql -U postgres -d links_db -c "$1"
}

echo "📋 Проверка текущих настроек..."

# Проверяем статус контейнеров
echo "Статус контейнеров:"
docker-compose ps

echo ""
echo "🔧 Применение конфигурации безопасности..."

# Останавливаем контейнеры
echo "Остановка контейнеров..."
docker-compose down

# Обновляем docker-compose для безопасности
echo "Обновление docker-compose конфигурации..."

# Запускаем контейнеры с новой конфигурацией
echo "Запуск контейнеров..."
docker-compose up -d

# Ждем запуска PostgreSQL
echo "Ожидание запуска PostgreSQL..."
sleep 10

# Проверяем подключение
echo "Проверка подключения к БД..."
docker exec links-db-1 pg_isready -U postgres

echo ""
echo "👤 Настройка пользователей и прав доступа..."

# Создаем ограниченного пользователя (если не существует)
echo "Настройка пользователя links_user..."
docker exec links-db-1 psql -U postgres -c "
-- Убираем права суперпользователя у links_user
ALTER ROLE links_user NOSUPERUSER NOCREATEDB NOCREATEROLE;

-- Создаем отдельного пользователя только для приложения (если нужно)
DO \$\$
BEGIN
    IF NOT EXISTS (SELECT FROM pg_catalog.pg_roles WHERE rolname = 'catlink_app') THEN
        CREATE ROLE catlink_app LOGIN PASSWORD 'catlink_app_SECURE_PASSWORD_$(date +%s)';
    END IF;
END
\$\$;

-- Даем только необходимые права на базу данных
GRANT CONNECT ON DATABASE links_db TO links_user;
GRANT USAGE ON SCHEMA public TO links_user;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO links_user;
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO links_user;

-- Права по умолчанию для новых объектов
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO links_user;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT USAGE, SELECT ON SEQUENCES TO links_user;
"

echo ""
echo "🔍 Проверка настроек безопасности..."

# Проверяем версию PostgreSQL
echo "Версия PostgreSQL:"
docker exec links-db-1 psql -U postgres -c "SELECT version();"

echo ""
echo "Настройки SSL:"
docker exec links-db-1 psql -U postgres -c "SHOW ssl; SHOW ssl_min_protocol_version; SHOW password_encryption;"

echo ""
echo "Пользователи и права:"
docker exec links-db-1 psql -U postgres -c "
SELECT rolname, rolsuper, rolcreatedb, rolcreaterole, rolcanlogin 
FROM pg_roles 
WHERE rolname IN ('postgres', 'links_user', 'catlink_app')
ORDER BY rolname;
"

echo ""
echo "Подключения к БД:"
docker exec links-db-1 psql -U postgres -c "
SELECT datname, usename, client_addr, state 
FROM pg_stat_activity 
WHERE state = 'active';
"

echo ""
echo "✅ Настройка безопасности PostgreSQL завершена!"
echo ""
echo "📝 Примененные улучшения:"
echo "   - Убраны права суперпользователя у links_user"
echo "   - Настроен SSL с TLSv1.3"
echo "   - Включено детальное логирование"
echo "   - Ограничен доступ только для Docker сети"
echo "   - Улучшена аутентификация SCRAM-SHA-256"
echo ""
echo "⚠️  ВАЖНО: Убедитесь что backend приложение использует правильные"
echo "   настройки подключения в .env файле"
echo ""
echo "🔄 Для применения изменений перезапустите контейнеры:"
echo "   docker-compose down && docker-compose up -d"