#!/usr/bin/env pwsh
<#
.SYNOPSIS
    Script pour configurer la base de données PostgreSQL en production

.DESCRIPTION
    Ce script configure PostgreSQL pour Lions User Manager :
    - Création de la base de données lions_audit
    - Création de l'utilisateur lions_audit_user
    - Octroi des privilèges

.PARAMETER VpsHost
    Host SSH du VPS (ex: lions@176.57.150.2)

.PARAMETER Namespace
    Namespace Kubernetes pour PostgreSQL (défaut: postgresql)

.PARAMETER PostgresUser
    Utilisateur PostgreSQL (défaut: lionsuser)

.PARAMETER DatabaseName
    Nom de la base de données (défaut: lions_audit)

.PARAMETER DatabaseUser
    Nom de l'utilisateur de la base (défaut: lions_audit_user)

.PARAMETER DatabasePassword
    Mot de passe pour l'utilisateur de la base

.EXAMPLE
    .\setup-database-production.ps1 -VpsHost "lions@176.57.150.2" -DatabasePassword "strong-password-123"
#>

param(
    [Parameter(Mandatory=$true)]
    [string]$VpsHost,
    
    [Parameter(Mandatory=$false)]
    [string]$Namespace = "postgresql",
    
    [Parameter(Mandatory=$false)]
    [string]$PostgresUser = "lionsuser",
    
    [Parameter(Mandatory=$false)]
    [string]$DatabaseName = "lions_audit",
    
    [Parameter(Mandatory=$false)]
    [string]$DatabaseUser = "lions_audit_user",
    
    [Parameter(Mandatory=$true)]
    [string]$DatabasePassword
)

$ErrorActionPreference = "Stop"

# Couleurs
function Write-Success { Write-Host "✅ $args" -ForegroundColor Green }
function Write-Info { Write-Host "ℹ️  $args" -ForegroundColor Cyan }
function Write-Warning { Write-Host "⚠️  $args" -ForegroundColor Yellow }
function Write-Error { Write-Host "❌ $args" -ForegroundColor Red }
function Write-Step { Write-Host "`n🚀 $args" -ForegroundColor Magenta }

Write-Host @"

╔═══════════════════════════════════════════════════════════════════════════════╗
║                                                                               ║
║        🗄️  CONFIGURATION BASE DE DONNÉES PRODUCTION 🗄️                      ║
║                                                                               ║
╚═══════════════════════════════════════════════════════════════════════════════╝

"@ -ForegroundColor Cyan

Write-Info "VPS Host: $VpsHost"
Write-Info "Namespace: $Namespace"
Write-Info "Database: $DatabaseName"
Write-Info "Database User: $DatabaseUser"
Write-Info ""

# 1. Trouver le pod PostgreSQL
Write-Step "1. Recherche du pod PostgreSQL..."

$getPodCmd = "kubectl get pods -n $Namespace -o jsonpath='{.items[0].metadata.name}'"
try {
    $POSTGRES_POD = ssh.exe $VpsHost $getPodCmd
    if ([string]::IsNullOrEmpty($POSTGRES_POD)) {
        Write-Error "Aucun pod PostgreSQL trouvé dans le namespace $Namespace"
        exit 1
    }
    Write-Success "Pod PostgreSQL trouvé: $POSTGRES_POD"
} catch {
    Write-Error "Erreur lors de la recherche du pod: $($_.Exception.Message)"
    exit 1
}

# 2. Lister les bases de données existantes
Write-Step "2. Liste des bases de données existantes..."

$listDbCmd = "kubectl exec -n $Namespace $POSTGRES_POD -- psql -U $PostgresUser -d postgres -c '\l'"
try {
    ssh.exe $VpsHost $listDbCmd
} catch {
    Write-Warning "Erreur lors de la liste des bases: $($_.Exception.Message)"
}

# 3. Vérifier si la base existe déjà
Write-Step "3. Vérification de l'existence de la base de données..."

$checkDbCmd = "kubectl exec -n $Namespace $POSTGRES_POD -- psql -U $PostgresUser -d postgres -tAc \"SELECT 1 FROM pg_database WHERE datname='$DatabaseName'\""
try {
    $dbExists = ssh.exe $VpsHost $checkDbCmd
    
    if ($dbExists -eq "1") {
        Write-Warning "La base de données $DatabaseName existe déjà"
        $createDb = Read-Host "Voulez-vous la recréer ? (oui/non)"
        if ($createDb -eq "oui") {
            $dropDbCmd = "kubectl exec -n $Namespace $POSTGRES_POD -- psql -U $PostgresUser -d postgres -c 'DROP DATABASE IF EXISTS $DatabaseName;'"
            ssh.exe $VpsHost $dropDbCmd
            Write-Success "Base de données supprimée"
        } else {
            Write-Info "Base de données conservée"
        }
    }
} catch {
    Write-Warning "Erreur lors de la vérification: $($_.Exception.Message)"
}

# 4. Créer la base de données
Write-Step "4. Création de la base de données $DatabaseName..."

$createDbCmd = "kubectl exec -n $Namespace $POSTGRES_POD -- psql -U $PostgresUser -d postgres -c 'CREATE DATABASE $DatabaseName OWNER $PostgresUser;'"
try {
    ssh.exe $VpsHost $createDbCmd
    Write-Success "Base de données $DatabaseName créée"
} catch {
    Write-Warning "Erreur lors de la création (peut-être qu'elle existe déjà): $($_.Exception.Message)"
}

# 5. Créer l'utilisateur
Write-Step "5. Création de l'utilisateur $DatabaseUser..."

$createUserCmd = "kubectl exec -n $Namespace $POSTGRES_POD -- psql -U $PostgresUser -d postgres -c \"CREATE USER $DatabaseUser WITH PASSWORD '$DatabasePassword';\""
try {
    ssh.exe $VpsHost $createUserCmd
    Write-Success "Utilisateur $DatabaseUser créé"
} catch {
    Write-Warning "Erreur lors de la création de l'utilisateur (peut-être qu'il existe déjà): $($_.Exception.Message)"
}

# 6. Octroyer les privilèges
Write-Step "6. Octroi des privilèges..."

$grantDbCmd = "kubectl exec -n $Namespace $POSTGRES_POD -- psql -U $PostgresUser -d postgres -c 'GRANT ALL PRIVILEGES ON DATABASE $DatabaseName TO $DatabaseUser;'"
try {
    ssh.exe $VpsHost $grantDbCmd
    Write-Success "Privilèges accordés sur la base de données"
} catch {
    Write-Warning "Erreur lors de l'octroi des privilèges: $($_.Exception.Message)"
}

# 7. Octroyer les privilèges sur le schéma public
Write-Step "7. Octroi des privilèges sur le schéma public..."

$grantSchemaCmd = "kubectl exec -n $Namespace $POSTGRES_POD -- psql -U $PostgresUser -d $DatabaseName -c 'GRANT ALL ON SCHEMA public TO $DatabaseUser;'"
try {
    ssh.exe $VpsHost $grantSchemaCmd
    Write-Success "Privilèges accordés sur le schéma public"
} catch {
    Write-Warning "Erreur lors de l'octroi des privilèges sur le schéma: $($_.Exception.Message)"
}

# 8. Test de connexion
Write-Step "8. Test de connexion à la base de données..."

$testConnCmd = "kubectl exec -n $Namespace $POSTGRES_POD -- psql -U $DatabaseUser -d $DatabaseName -c 'SELECT version();'"
try {
    $version = ssh.exe $VpsHost $testConnCmd
    Write-Success "Connexion réussie !"
    Write-Info "Version PostgreSQL: $version"
} catch {
    Write-Error "Échec de la connexion: $($_.Exception.Message)"
    exit 1
}

# 9. Résumé
Write-Step "9. Résumé de la configuration..."

Write-Host @"

╔═══════════════════════════════════════════════════════════════════════════════╗
║                                                                               ║
║                    ✅ CONFIGURATION BASE DE DONNÉES TERMINÉE ✅               ║
║                                                                               ║
╚═══════════════════════════════════════════════════════════════════════════════╝

"@ -ForegroundColor Green

Write-Host "📋 INFORMATIONS IMPORTANTES:" -ForegroundColor Yellow
Write-Host ""
Write-Host "🗄️  BASE DE DONNÉES:" -ForegroundColor Cyan
Write-Host "   Nom: $DatabaseName"
Write-Host "   Utilisateur: $DatabaseUser"
Write-Host "   Mot de passe: $DatabasePassword"
Write-Host ""
Write-Host "🔗 CONNEXION:" -ForegroundColor Cyan
Write-Host "   Host: lions-db.lions.svc.cluster.local (Service Kubernetes)"
Write-Host "   Port: 5432"
Write-Host "   Database: $DatabaseName"
Write-Host ""
Write-Host "⚠️  ACTIONS REQUISES:" -ForegroundColor Yellow
Write-Host "   1. Sauvegardez le mot de passe de la base de données"
Write-Host "   2. Créez le secret Kubernetes avec ces informations"
Write-Host "   3. Vérifiez que Flyway peut exécuter les migrations"
Write-Host ""

