modules/devops/Write-MigrationScript.ps1

param(
    [string]$ProjectName,
    [string]$OrmMode,
    [string]$OutputPath
)

. (Join-Path (Split-Path $MyInvocation.MyCommand.Path) "..\core\Utils.ps1")

# Migration script sadece EFCore veya Hybrid modda üretilir
if ($OrmMode -notmatch "EFCore|Hybrid") { return }

function Write-File($rel, $con) { Write-CoreFile (Join-Path $OutputPath $rel) $con }

$migratePs1Content = @'
#Requires -Version 5.1
# EF Core Migration Helper — {P}
# Kullanim: .\scripts\migrate.ps1 [-MigrationName <ad>] [-Revert]
 
param(
    [string]$MigrationName = "Initial",
    [switch]$Revert
)
 
# Self-healing dotnet-ef tool check
$dotnetEfInstalled = dotnet tool list -g | Select-String "dotnet-ef"
if (-not $dotnetEfInstalled) {
    Write-Host "dotnet-ef araci kuruluyor..." -ForegroundColor Yellow
    dotnet tool install --global dotnet-ef
}
$userProfile = [System.Environment]::GetFolderPath('UserProfile')
$globalToolsPath = Join-Path $userProfile ".dotnet\tools"
if ($env:PATH -notlike "*$globalToolsPath*") {
    $env:PATH = "$env:PATH;$globalToolsPath"
}
 
# Resolve relative paths using PSScriptRoot
$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
$solutionDir = Split-Path $scriptDir -Parent
$persistenceProj = Join-Path $solutionDir "src\{P}.Persistence"
$startupProj = Join-Path $solutionDir "src\{P}.WebApi"
 
if ($Revert) {
    Write-Host "Son migration geri aliniyor..." -ForegroundColor Yellow
    dotnet ef database update 0 `
        --project $persistenceProj `
        --startup-project $startupProj
    Write-Host "Tum migrasyonlar siliniyor..." -ForegroundColor Yellow
    dotnet ef migrations remove `
        --project $persistenceProj `
        --startup-project $startupProj
    Write-Host "Tamamlandi." -ForegroundColor Green
} else {
    Write-Host "Migration olusturuluyor: $MigrationName" -ForegroundColor Cyan
    dotnet ef migrations add $MigrationName `
        --project $persistenceProj `
        --startup-project $startupProj `
        --output-dir Migrations
 
    Write-Host "Veritabani guncelleniyor..." -ForegroundColor Cyan
    dotnet ef database update `
        --project $persistenceProj `
        --startup-project $startupProj
 
    Write-Host "Tamamlandi." -ForegroundColor Green
}
'@
.Replace("{P}", $ProjectName)

$migrateShContent = @'
#!/bin/bash
# EF Core Migration Helper — {P}
# Kullanim: ./scripts/migrate.sh [MigrationName] [--revert]
 
MIGRATION_NAME=${1:-Initial}
 
# Self-healing dotnet-ef check
if ! command -v dotnet-ef &> /dev/null
then
    echo "dotnet-ef araci kuruluyor..."
    dotnet tool install --global dotnet-ef
    export PATH="$PATH:$HOME/.dotnet/tools"
fi
 
# Resolve paths dynamically using BASH_SOURCE
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
SOLUTION_DIR="$( dirname "$SCRIPT_DIR" )"
PERSISTENCE_PROJ="$SOLUTION_DIR/src/{P}.Persistence"
STARTUP_PROJ="$SOLUTION_DIR/src/{P}.WebApi"
 
if [ "$2" = "--revert" ]; then
    echo "Son migration geri aliniyor..."
    dotnet ef database update 0 \
        --project "$PERSISTENCE_PROJ" \
        --startup-project "$STARTUP_PROJ"
    dotnet ef migrations remove \
        --project "$PERSISTENCE_PROJ" \
        --startup-project "$STARTUP_PROJ"
    echo "Tamamlandi."
else
    echo "Migration olusturuluyor: $MIGRATION_NAME"
    dotnet ef migrations add "$MIGRATION_NAME" \
        --project "$PERSISTENCE_PROJ" \
        --startup-project "$STARTUP_PROJ" \
        --output-dir Migrations
 
    echo "Veritabani guncelleniyor..."
    dotnet ef database update \
        --project "$PERSISTENCE_PROJ" \
        --startup-project "$STARTUP_PROJ"
 
    echo "Tamamlandi."
fi
'@
.Replace("{P}", $ProjectName)

Write-File "scripts\migrate.ps1" $migratePs1Content
Write-File "scripts\migrate.sh" $migrateShContent