@echo off
REM Depto de Engenharia e Automacao - Master Automacao - Autor: Derlivon Silva
REM Diagnostica falha de backup do Real Prime (banco ~4 GB)
REM Saida em DIAG-BACKUP-REALPRIME.txt abre no Notepad.

setlocal
cd /d "%~dp0"

net session >nul 2>&1
if %errorlevel% neq 0 (
    powershell -NoProfile -Command "Start-Process cmd -ArgumentList '/c','\"%~f0\"' -Verb RunAs"
    exit /b
)

set "OUT=%~dp0DIAG-BACKUP-REALPRIME.txt"

powershell -NoProfile -ExecutionPolicy Bypass -Command ^
  "$out='%OUT%';" ^
  "$bi='C:\Program Files\PremiumExpressBI\app';" ^
  "$sb=[Text.StringBuilder]::new();" ^
  "function W($m){[void]$sb.AppendLine($m)};" ^
  "W('=== DIAG BACKUP REAL PRIME - ' + (Get-Date) + ' ===');" ^
  "W('Maquina: '+$env:COMPUTERNAME); W('');" ^
  "W('[1] Espaco em disco C:');" ^
  "$d=Get-PSDrive C; W('  Livre: '+[math]::Round($d.Free/1GB,2)+' GB de '+[math]::Round(($d.Free+$d.Used)/1GB,2)+' GB');" ^
  "if($d.Free -lt 10GB){W('  *** ATENCAO: menos de 10GB livres — backup de 4GB precisa de pico ~8GB!')};" ^
  "W('');" ^
  "W('[2] Job do Real Prime:');" ^
  "$jobs=Get-ChildItem \"$bi\storage\backup\jobs\*.json\" -ErrorAction SilentlyContinue;" ^
  "$jobRP=$null;" ^
  "foreach($f in $jobs){$j=Get-Content $f.FullName -Raw|ConvertFrom-Json; if($j.nome -match 'real|prime'){$jobRP=$j; W('  Arquivo: '+$f.Name); W('  Nome: '+$j.nome); W('  Ultimo status: '+$j.ultimo_status); W('  Ultimo run: '+$j.ultimo_run_em); W('  Tentativa: '+$j.tentativa_atual+'/'+$j.max_tentativas); W('  Proxima tentativa: '+$j.tentar_novamente_em); break}};" ^
  "if(-not $jobRP){W('  JOB DO REAL PRIME NAO ACHADO')};" ^
  "W('');" ^
  "W('[3] Ultimas 5 entradas do log (jsonl):');" ^
  "if($jobRP){$logFile=\"$bi\storage\backup\logs\\$($jobRP.id).jsonl\"; if(Test-Path $logFile){Get-Content $logFile -Tail 5 | ForEach-Object {$e=$_|ConvertFrom-Json; W('  --- '+$e.em+' ---'); W('  status: '+$e.status); W('  erro: '+$e.erro); $lg=($e.log|Out-String); W('  log: '+$lg.Substring(0,[Math]::Min(700,$lg.Length))); W('')}}else{W('  log do job nao encontrado')}};" ^
  "W('');" ^
  "W('[4] .fbk gerados (ultimos 5):');" ^
  "if($jobRP){$pasta=\"$bi\storage\backup\arquivos\\$($jobRP.id)\"; if(Test-Path $pasta){Get-ChildItem $pasta -File -ErrorAction SilentlyContinue | Sort-Object LastWriteTime -Descending | Select-Object -First 5 | ForEach-Object {W('  '+$_.LastWriteTime+'  '+[math]::Round($_.Length/1MB,1)+' MB  '+$_.Name)}}else{W('  pasta nao existe — backup nunca completou')}};" ^
  "W('');" ^
  "W('[5] gbak.exe + fbclient.dll versoes:');" ^
  "foreach($p in @('C:\Program Files\Firebird\Firebird_2_5\bin\gbak.exe','C:\Program Files\Firebird\Firebird_3_0\gbak.exe','C:\Program Files\PremiumExpressBI\Firebird_2_5\bin\gbak.exe','C:\Program Files\PremiumExpressBI\Firebird_3_0\gbak.exe')){if(Test-Path $p){W('  '+$p+' = '+(Get-Item $p).VersionInfo.FileVersion)}};" ^
  "foreach($p in @('C:\Program Files\Firebird\Firebird_2_5\bin\fbclient.dll','C:\Program Files\Firebird\Firebird_3_0\fbclient.dll','C:\Program Files\PremiumExpressBI\Firebird_3_0\fbclient.dll','C:\Windows\System32\fbclient.dll','C:\Windows\SysWOW64\fbclient.dll')){if(Test-Path $p){W('  '+$p+' = '+(Get-Item $p).VersionInfo.FileVersion)}};" ^
  "W('');" ^
  "W('[6] gbak.exe rodando AGORA:');" ^
  "$gs=Get-Process gbak -ErrorAction SilentlyContinue;" ^
  "if($gs){foreach($g in $gs){W('  PID '+$g.Id+' iniciado em '+$g.StartTime)}}else{W('  (nenhum)')};" ^
  "W('');" ^
  "W('[7] scheduler.log (ultimas 15 linhas):');" ^
  "if(Test-Path \"$bi\storage\backup\scheduler.log\"){Get-Content \"$bi\storage\backup\scheduler.log\" -Tail 15 | ForEach-Object {W('  '+$_)}};" ^
  "W(''); W('=== FIM ===');" ^
  "[IO.File]::WriteAllText($out, $sb.ToString(), [Text.UTF8Encoding]::new($false));" ^
  "Start-Process notepad.exe -ArgumentList $out;"

pause
