@echo off
chcp 65001 > nul
title Correcao - Remover Fix NVMe
color 0E

net session >nul 2>&1
if %errorlevel% neq 0 (
    color 0C
    echo [ERRO] Execute como Administrador!
    pause & exit /b
)

set "FLAG=%TEMP%\correcao_nvme_etapa2.flag"
set "DB_LIST=%TEMP%\correcao_nvme_databases.txt"
set "LOG=%TEMP%\CorrecaoRemoverFix_%COMPUTERNAME%_%DATE:~6,4%%DATE:~3,2%%DATE:~0,2%.txt"

:: Se flag existe, veio do reboot - pula para ETAPA 2
if exist "%FLAG%" goto ETAPA2

:: ================================================================
:ETAPA1
:: ================================================================
echo Correcao RemoverFix ETAPA1 - %COMPUTERNAME% - %DATE% %TIME% > "%LOG%"

echo ================================================================
echo   CORRECAO: Remover Fix de Setor NVMe Desnecessario
echo   Maquina: %COMPUTERNAME%
echo ================================================================
echo.

:: ----------------------------------------------------------------
echo [1/6] Verificando se fix esta aplicado...
reg query "HKLM\SYSTEM\CurrentControlSet\Services\stornvme\Parameters\Device" /v "ForcedPhysicalSectorSizeInBytes" >nul 2>&1
if %errorlevel% neq 0 (
    color 0A
    echo.
    echo  [OK] Fix NAO esta aplicado nesta maquina.
    echo       Nenhuma acao necessaria.
    echo [RESULTADO] Fix nao encontrado - nenhuma acao necessaria >> "%LOG%"
    echo.
    pause & exit /b
)
echo     Fix encontrado - prosseguindo com remocao.
echo [Fix] Encontrado, removendo >> "%LOG%"

:: ----------------------------------------------------------------
echo.
echo [2/6] Mapeando bancos de dados dos usuarios...

:: Limpar lista anterior se existir
if exist "%DB_LIST%" del "%DB_LIST%" >nul 2>&1

:: Buscar todos os MDF de usuarios em todos os perfis (excluindo bancos de sistema)
powershell -NoProfile -Command ^
    "Get-ChildItem 'C:\Users' -Recurse -Filter '*.mdf' -ErrorAction SilentlyContinue | " ^
    "Where-Object { $_.Name -notmatch '^(master|model|msdbdata|tempdb|mssqlsystemresource)\.mdf$' } | " ^
    "Select-Object -ExpandProperty FullName | " ^
    "Out-File -FilePath '%DB_LIST%' -Encoding UTF8"

:: Contar quantos bancos foram encontrados
set DB_COUNT=0
if exist "%DB_LIST%" (
    for /f %%i in ('type "%DB_LIST%" ^| find /c /v ""') do set DB_COUNT=%%i
)

if %DB_COUNT% GTR 0 (
    echo     %DB_COUNT% banco(s) de usuario encontrado(s):
    type "%DB_LIST%"
    echo [Bancos] %DB_COUNT% encontrados >> "%LOG%"
    type "%DB_LIST%" >> "%LOG%"
) else (
    echo     Nenhum banco de usuario encontrado.
    echo [Bancos] Nenhum encontrado >> "%LOG%"
)

:: ----------------------------------------------------------------
echo.
echo [3/6] Fazendo backup do registro...
reg export "HKLM\SYSTEM\CurrentControlSet\Services\stornvme\Parameters\Device" "%TEMP%\backup_stornvme_%COMPUTERNAME%.reg" /y >nul 2>&1
echo     Backup salvo em: %TEMP%\backup_stornvme_%COMPUTERNAME%.reg
echo [Backup] Feito >> "%LOG%"

:: ----------------------------------------------------------------
echo.
echo [4/6] Parando instancias do LocalDB...
sqllocaldb stop MSSQLLocalDB -k >nul 2>&1
sqllocaldb stop ProjectsV13 >nul 2>&1
sqllocaldb stop ProjectModels >nul 2>&1
echo     Instancias paradas.
echo [LocalDB] Instancias paradas >> "%LOG%"

:: ----------------------------------------------------------------
echo.
echo [5/6] Removendo ForcedPhysicalSectorSizeInBytes...
reg delete "HKLM\SYSTEM\CurrentControlSet\Services\stornvme\Parameters\Device" /v "ForcedPhysicalSectorSizeInBytes" /f >nul 2>&1
if %errorlevel% equ 0 (
    echo     Fix removido com sucesso.
    echo [Fix] Removido >> "%LOG%"
) else (
    color 0C
    echo     [ERRO] Falha ao remover fix.
    echo [ERRO] Falha ao remover fix >> "%LOG%"
    pause & exit /b
)

:: ----------------------------------------------------------------
echo.
echo [6/6] Deletando instancia e removendo MDF/LDF de sistema...
sqllocaldb delete MSSQLLocalDB >nul 2>&1
set "INSTANCE_PATH=%LOCALAPPDATA%\Microsoft\Microsoft SQL Server Local DB\Instances\MSSQLLocalDB"
if exist "%INSTANCE_PATH%" (
    del /f /q "%INSTANCE_PATH%\*.mdf" >nul 2>&1
    del /f /q "%INSTANCE_PATH%\*.ldf" >nul 2>&1
    del /f /q "%INSTANCE_PATH%\*.log" >nul 2>&1
    echo     Instancia deletada e arquivos de sistema removidos.
    echo [MDF sistema] Removidos >> "%LOG%"
) else (
    echo     Pasta de instancia nao encontrada - OK.
    echo [MDF sistema] Pasta nao encontrada >> "%LOG%"
)

:: ----------------------------------------------------------------
:: Criar flag e registrar execucao automatica pos-reboot
echo etapa2 > "%FLAG%"
set "SCRIPT_PATH=%~f0"
reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce" /v "CorrecaoLocalDB" /t REG_SZ /d "cmd /c \"%SCRIPT_PATH%\"" /f >nul 2>&1
echo [RunOnce] Registrado >> "%LOG%"

echo.
echo ================================================================
echo   ETAPA 1 CONCLUIDA
echo ================================================================
echo.
echo  Fix removido. Apos reiniciar, este script rodara
echo  automaticamente e recriara o banco de dados.
if %DB_COUNT% GTR 0 (
    echo  Os bancos dos usuarios serao reatachados automaticamente.
)
echo.
echo [ETAPA1] Concluida >> "%LOG%"

set /p REINICIAR="Reiniciar agora? (S/N): "
if /i "%REINICIAR%"=="S" (
    echo Reiniciando em 10 segundos...
    timeout /t 10
    shutdown /r /t 0
) else (
    echo.
    echo  ATENCAO: Execute este script novamente apos reiniciar!
    pause
)
exit /b

:: ================================================================
:ETAPA2
:: ================================================================
del "%FLAG%" >nul 2>&1
reg delete "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce" /v "CorrecaoLocalDB" /f >nul 2>&1

echo.
echo ================================================================
echo   ETAPA 2: Recriando banco de dados apos reboot
echo   Maquina: %COMPUTERNAME%
echo ================================================================
echo.
echo [ETAPA2] Iniciada - %DATE% %TIME% >> "%LOG%"

timeout /t 5 /nobreak >nul

:: ----------------------------------------------------------------
echo [1/4] Versao do LocalDB instalado:
sqllocaldb versions
sqllocaldb versions >> "%LOG%" 2>&1
echo.

:: ----------------------------------------------------------------
echo [2/4] Criando e iniciando instancia MSSQLLocalDB...
sqllocaldb delete MSSQLLocalDB >nul 2>&1
sqllocaldb create MSSQLLocalDB
if %errorlevel% neq 0 (
    color 0C
    echo  [ERRO] Falha ao criar instancia.
    echo [ERRO] Falha ao criar instancia >> "%LOG%"
    pause & exit /b
)

sqllocaldb start MSSQLLocalDB
if %errorlevel% neq 0 (
    color 0C
    echo  [ERRO] Falha ao iniciar instancia.
    echo [ERRO] Falha ao iniciar >> "%LOG%"
    pause & exit /b
)
echo     Instancia criada e iniciada.
echo [LocalDB] Instancia criada e iniciada >> "%LOG%"

:: ----------------------------------------------------------------
echo.
echo [3/4] Reatachando bancos de dados dos usuarios...

if not exist "%DB_LIST%" (
    echo     Nenhum banco de usuario para reatachar.
    echo [Reattach] Sem bancos para reatachar >> "%LOG%"
    goto VERIFICAR
)

:: Contar bancos
set DB_COUNT=0
for /f %%i in ('type "%DB_LIST%" ^| find /c /v ""') do set DB_COUNT=%%i

if %DB_COUNT% EQU 0 (
    echo     Nenhum banco de usuario para reatachar.
    echo [Reattach] Lista vazia >> "%LOG%"
    goto VERIFICAR
)

echo     Reatachando %DB_COUNT% banco(s)...
echo [Reattach] Iniciando %DB_COUNT% banco(s) >> "%LOG%"

:: Para cada MDF encontrado, reatachar
for /f "usebackq delims=" %%F in ("%DB_LIST%") do (
    call :ATTACH_DB "%%F"
)

del "%DB_LIST%" >nul 2>&1

:: ----------------------------------------------------------------
:VERIFICAR
echo.
echo [4/4] Status final:
sqllocaldb info MSSQLLocalDB
sqllocaldb info MSSQLLocalDB >> "%LOG%"

echo.
echo Bancos de dados anexados:
sqlcmd -S "(localdb)\MSSQLLocalDB" -Q "SELECT name, state_desc FROM sys.databases WHERE name NOT IN ('master','model','msdb','tempdb')" -W 2>nul
sqlcmd -S "(localdb)\MSSQLLocalDB" -Q "SELECT name, state_desc FROM sys.databases WHERE name NOT IN ('master','model','msdb','tempdb')" -W >> "%LOG%" 2>nul

sqllocaldb info MSSQLLocalDB | find "Running" >nul 2>&1
if %errorlevel% equ 0 (
    color 0A
    echo.
    echo ================================================================
    echo   CORRECAO CONCLUIDA COM SUCESSO
    echo ================================================================
    echo  LocalDB funcionando. Bancos de usuarios reatachados.
    echo [RESULTADO] Sucesso - LocalDB Running >> "%LOG%"
) else (
    color 0C
    echo.
    echo ================================================================
    echo   ATENCAO: Instancia nao esta Running
    echo ================================================================
    set "INSTANCE_PATH=%LOCALAPPDATA%\Microsoft\Microsoft SQL Server Local DB\Instances\MSSQLLocalDB"
    echo  Verifique: %INSTANCE_PATH%\error.log
    echo [RESULTADO] Falha - instancia nao Running >> "%LOG%"
)

echo.
echo Log completo: %LOG%
echo.
pause
exit /b

:: ================================================================
:: Subrotina: ATTACH_DB
:: Parametro: caminho completo do MDF
:: ================================================================
:ATTACH_DB
set "MDF_PATH=%~1"
set "MDF_FILE=%~nx1"

:: Extrair nome do banco (nome do arquivo sem extensao)
set "DB_NAME=%MDF_FILE:.mdf=%"

:: Derivar path do LDF (padrao: nome_log.ldf)
set "LDF_PATH=%MDF_PATH:.mdf=_log.ldf%"

echo     Reatachando: %DB_NAME%
echo [Reattach] %DB_NAME% - MDF: %MDF_PATH% >> "%LOG%"

:: Verificar se MDF existe
if not exist "%MDF_PATH%" (
    echo     [AVISO] MDF nao encontrado: %MDF_PATH%
    echo [Reattach] AVISO - MDF nao encontrado: %MDF_PATH% >> "%LOG%"
    goto :EOF
)

:: Tentar attach com LDF
if exist "%LDF_PATH%" (
    sqlcmd -S "(localdb)\MSSQLLocalDB" -Q "CREATE DATABASE [%DB_NAME%] ON (FILENAME = '%MDF_PATH%'), (FILENAME = '%LDF_PATH%') FOR ATTACH" >nul 2>&1
) else (
    :: Attach sem LDF (SQL recria o log automaticamente)
    sqlcmd -S "(localdb)\MSSQLLocalDB" -Q "CREATE DATABASE [%DB_NAME%] ON (FILENAME = '%MDF_PATH%') FOR ATTACH_REBUILD_LOG" >nul 2>&1
)

if %errorlevel% equ 0 (
    echo     [OK] %DB_NAME% reatachado com sucesso.
    echo [Reattach] OK - %DB_NAME% >> "%LOG%"
) else (
    echo     [ERRO] Falha ao reatachar %DB_NAME%
    echo [Reattach] ERRO - %DB_NAME% >> "%LOG%"
)
goto :EOF
