#!/usr/bin/env bash

set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"
ENV_FILE="$PROJECT_ROOT/.env"
MIGRATION_FILE="$PROJECT_ROOT/migrations/migrations_v1.sql"

# Carrega as variáveis de ambiente do arquivo .env se ele existir
if [[ -f "$ENV_FILE" ]]; then
    set -a
    # shellcheck disable=SC1090
    source "$ENV_FILE"
    set +a
fi

# Fallbacks caso não estejam definidas no .env
DB_HOST="${DB_HOST:-127.0.0.1}"
DB_PORT="${DB_PORT:-5432}"
DB_NAME="${DB_NAME:-}"
DB_USER="${DB_USER:-}"
DB_PASSWORD="${DB_PASSWORD:-${DB_PASS:-}}"

# Validações básicas
if [[ -z "$DB_NAME" ]]; then
    echo "Erro: DB_NAME não está configurado no .env."
    exit 1
fi

if [[ -z "$DB_USER" ]]; then
    echo "Erro: DB_USER não está configurado no .env."
    exit 1
fi

# Exporta a senha temporariamente para o psql não pedir interativamente
export PGPASSWORD="$DB_PASSWORD"

echo "Conectando ao PostgreSQL para recriar o banco '$DB_NAME'..."

# Conecta ao banco padrão 'postgres' para conseguir derrubar e recriar o seu banco
psql "host=$DB_HOST port=$DB_PORT user=$DB_USER dbname=postgres" -v ON_ERROR_STOP=1 <<SQL
-- Derruba conexões ativas para evitar o erro de "database is being accessed by other users"
SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE datname = '$DB_NAME'
  AND pid <> pg_backend_pid();

DROP DATABASE IF EXISTS "$DB_NAME";
CREATE DATABASE "$DB_NAME" OWNER "$DB_USER";
SQL

echo "Aplicando as migrações do arquivo: $(basename "$MIGRATION_FILE")..."

# Conecta diretamente no banco novo e roda o arquivo de SQL
psql "host=$DB_HOST port=$DB_PORT user=$DB_USER dbname=$DB_NAME" -v ON_ERROR_STOP=1 -f "$MIGRATION_FILE"

echo "--------------------------------------------------------"
echo "Banco de dados '$DB_NAME' recriado com sucesso e migration aplicada!"
echo "--------------------------------------------------------"