@echo off
chcp 65001 > nul
title Diagnostico SQL LocalDB - Suporte N1
color 0A

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

:: Log file
set "LOG=%TEMP%\DiagnosticoN1_%COMPUTERNAME%_%DATE:~6,4%%DATE:~3,2%%DATE:~0,2%.txt"
echo Diagnostico SQL LocalDB > "%LOG%"
echo Maquina: %COMPUTERNAME% >> "%LOG%"
echo Usuario: %USERNAME% >> "%LOG%"
echo Data: %DATE% %TIME% >> "%LOG%"
echo. >> "%LOG%"

echo ================================================================
echo   DIAGNOSTICO SQL LocalDB - SUPORTE N1
echo   Maquina: %COMPUTERNAME%
echo ================================================================
echo.

:: ================================================================
:: COLETA 1: Windows Version
:: ================================================================
echo [1/5] Verificando versao do Windows...
for /f "tokens=2 delims=[]" %%i in ('ver') do set WIN_VER=%%i
echo     Windows: %WIN_VER%
echo [Windows] %WIN_VER% >> "%LOG%"

:: Pegar build number via registry
for /f "tokens=3" %%i in ('reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v CurrentBuild 2^>nul') do set WIN_BUILD=%%i
echo     Build: %WIN_BUILD%
echo [Windows Build] %WIN_BUILD% >> "%LOG%"

:: ================================================================
:: COLETA 2: LocalDB instalado
:: ================================================================
echo.
echo [2/5] Verificando LocalDB instalado...
set LOCALDB_VERSION=NENHUM

sqllocaldb versions > "%TEMP%\localdb_ver.txt" 2>&1
type "%TEMP%\localdb_ver.txt" | find "2022" >nul 2>&1
if %errorlevel% equ 0 (
    set LOCALDB_VERSION=2022
    echo     LocalDB: 2022 (16.x) - OK para Windows 11
    echo [LocalDB] 2022 instalado >> "%LOG%"
)

type "%TEMP%\localdb_ver.txt" | find "2019" >nul 2>&1
if %errorlevel% equ 0 (
    if "%LOCALDB_VERSION%"=="2022" (
        set LOCALDB_VERSION=AMBOS
        echo     LocalDB: 2019 E 2022 instalados simultaneamente
        echo [LocalDB] 2019 E 2022 instalados >> "%LOG%"
    ) else (
        set LOCALDB_VERSION=2019
        echo     LocalDB: 2019 (15.x) - PROBLEMA em Windows 11 Build maior que 22000
        echo [LocalDB] 2019 instalado >> "%LOG%"
    )
)

if "%LOCALDB_VERSION%"=="NENHUM" (
    echo     LocalDB: NAO INSTALADO
    echo [LocalDB] Nao instalado >> "%LOG%"
)

:: ================================================================
:: COLETA 3: Fix stornvme aplicado?
:: ================================================================
echo.
echo [3/5] Verificando fix de setor NVMe...
set FIX_APLICADO=NAO

reg query "HKLM\SYSTEM\CurrentControlSet\Services\stornvme\Parameters\Device" /v "ForcedPhysicalSectorSizeInBytes" >nul 2>&1
if %errorlevel% equ 0 (
    set FIX_APLICADO=SIM
    for /f "tokens=3" %%i in ('reg query "HKLM\SYSTEM\CurrentControlSet\Services\stornvme\Parameters\Device" /v "ForcedPhysicalSectorSizeInBytes" 2^>nul ^| find "ForcedPhysical"') do set FIX_VALOR=%%i
    echo     Fix stornvme: APLICADO ^(valor: %FIX_VALOR%^)
    echo [stornvme Fix] APLICADO - valor: %FIX_VALOR% >> "%LOG%"
) else (
    echo     Fix stornvme: NAO aplicado
    echo [stornvme Fix] NAO aplicado >> "%LOG%"
)

:: ================================================================
:: COLETA 4: Setor fisico real do disco
:: ================================================================
echo.
echo [4/5] Verificando setor fisico do disco...

for /f "tokens=3" %%i in ('wmic diskdrive get BytesPerSector /value 2^>nul ^| find "BytesPerSector"') do set SETOR_WMI=%%i
:: Limpar CR/LF do WMI
set SETOR_WMI=%SETOR_WMI: =%

echo     Setor reportado pelo driver (WMI): %SETOR_WMI% bytes
echo [Setor WMI] %SETOR_WMI% bytes >> "%LOG%"

:: Setor via fsutil
for /f "tokens=4" %%i in ('fsutil fsinfo ntfsinfo C: 2^>nul ^| find "Bytes Por Setor F"') do set SETOR_FISICO=%%i
echo     Setor fisico NTFS (fsutil): %SETOR_FISICO% bytes
echo [Setor fsutil fisico] %SETOR_FISICO% bytes >> "%LOG%"

:: Modelo do SSD
for /f "tokens=*" %%i in ('wmic diskdrive get Model /value 2^>nul ^| find "Model"') do set DISCO_MODELO=%%i
echo     Modelo do disco: %DISCO_MODELO%
echo [Disco] %DISCO_MODELO% >> "%LOG%"

:: Verificar se é Samsung (precisa do fix)
echo %DISCO_MODELO% | find /i "Samsung" >nul 2>&1
if %errorlevel% equ 0 (
    set DISCO_SAMSUNG=SIM
    echo     Disco Samsung detectado - fix pode ser necessario
    echo [Samsung SSD] SIM >> "%LOG%"
) else (
    set DISCO_SAMSUNG=NAO
    echo     Disco NAO e Samsung
    echo [Samsung SSD] NAO >> "%LOG%"
)

:: ================================================================
:: COLETA 5: Status da instancia LocalDB
:: ================================================================
echo.
echo [5/5] Verificando instancia MSSQLLocalDB...
set INSTANCIA_STATUS=NAO_EXISTE

sqllocaldb info MSSQLLocalDB > "%TEMP%\localdb_info.txt" 2>&1
type "%TEMP%\localdb_info.txt" | find "Running" >nul 2>&1
if %errorlevel% equ 0 (
    set INSTANCIA_STATUS=RUNNING
    echo     Instancia: RUNNING - funcionando
    echo [Instancia] RUNNING >> "%LOG%"
)
type "%TEMP%\localdb_info.txt" | find "Stopped" >nul 2>&1
if %errorlevel% equ 0 (
    set INSTANCIA_STATUS=STOPPED
    echo     Instancia: STOPPED - parada
    echo [Instancia] STOPPED >> "%LOG%"
)
type "%TEMP%\localdb_info.txt" | find "not created" >nul 2>&1
if %errorlevel% equ 0 (
    set INSTANCIA_STATUS=NAO_EXISTE
    echo     Instancia: NAO EXISTE
    echo [Instancia] NAO EXISTE >> "%LOG%"
)

:: ================================================================
:: ANALISE E DIAGNOSTICO
:: ================================================================
echo.
echo ================================================================
echo   RESULTADO DO DIAGNOSTICO
echo ================================================================
echo.
echo [DIAGNOSTICO] >> "%LOG%"

set ACAO=NENHUMA
set PROBLEMA=NENHUM

:: --- Regra 1: Fix aplicado em disco que NAO e Samsung ---
if "%FIX_APLICADO%"=="SIM" if "%DISCO_SAMSUNG%"=="NAO" (
    set PROBLEMA=FIX_DESNECESSARIO
    set ACAO=REMOVER_FIX
    color 0E
    echo  [!] PROBLEMA: Fix de setor aplicado em disco que NAO precisa
    echo      Disco: %DISCO_MODELO%
    echo      O fix * 4096 foi aplicado desnecessariamente.
    echo      ACAO NECESSARIA: Remover o fix e reiniciar.
    echo.
    echo [PROBLEMA] Fix desnecessario em disco nao-Samsung >> "%LOG%"
    echo [ACAO] REMOVER_FIX >> "%LOG%"
)

:: --- Regra 2: Fix aplicado em Samsung - verificar se valor esta correto ---
if "%FIX_APLICADO%"=="SIM" if "%DISCO_SAMSUNG%"=="SIM" (
    set PROBLEMA=FIX_SAMSUNG_OK
    set ACAO=NENHUMA
    color 0A
    echo  [OK] Fix aplicado em Samsung SSD - correto, manter.
    echo.
    echo [PROBLEMA] Nenhum - fix correto para Samsung >> "%LOG%"
    echo [ACAO] NENHUMA >> "%LOG%"
)

:: --- Regra 3: LocalDB 2019 no Windows 11 ---
if "%LOCALDB_VERSION%"=="2019" (
    set WIN_COMPAT=PROBLEMA
    if %WIN_BUILD% GEQ 22000 (
        color 0E
        echo  [!] PROBLEMA: LocalDB 2019 RTM incompativel com Windows 11
        echo      Build Windows: %WIN_BUILD%
        echo      ACAO NECESSARIA: Instalar LocalDB 2022
        echo.
        echo [PROBLEMA] LocalDB 2019 incompativel com Win11 build %WIN_BUILD% >> "%LOG%"
        echo [ACAO] INSTALAR_LOCALDB_2022 >> "%LOG%"
        set ACAO=INSTALAR_LOCALDB_2022
    )
)

:: --- Regra 4: Tudo OK ---
if "%PROBLEMA%"=="NENHUM" if "%INSTANCIA_STATUS%"=="RUNNING" (
    color 0A
    echo  [OK] Nenhum problema detectado. LocalDB funcionando normalmente.
    echo [RESULTADO] OK - sem problemas >> "%LOG%"
)

:: --- Regra 5: Instancia parada mas sem problema identificado ---
if "%INSTANCIA_STATUS%"=="STOPPED" if "%ACAO%"=="NENHUMA" (
    color 0E
    echo  [!] Instancia parada - tentar iniciar
    echo [ACAO] TENTAR_START >> "%LOG%"
    set ACAO=TENTAR_START
)

echo.
echo ================================================================
echo   RESUMO PARA O CHAMADO
echo ================================================================
echo.
echo Maquina  : %COMPUTERNAME%
echo Windows  : Build %WIN_BUILD%
echo LocalDB  : %LOCALDB_VERSION%
echo Fix NVMe : %FIX_APLICADO%
echo Samsung  : %DISCO_SAMSUNG%
echo Instancia: %INSTANCIA_STATUS%
echo Acao     : %ACAO%
echo.
echo Resumo salvo em: %LOG%
echo.
echo [RESUMO FINAL] >> "%LOG%"
echo Maquina=%COMPUTERNAME% / Win Build=%WIN_BUILD% / LocalDB=%LOCALDB_VERSION% / Fix=%FIX_APLICADO% / Samsung=%DISCO_SAMSUNG% / Instancia=%INSTANCIA_STATUS% / Acao=%ACAO% >> "%LOG%"

echo ================================================================
echo   PROXIMOS PASSOS
echo ================================================================
echo.

if "%ACAO%"=="REMOVER_FIX" (
    echo  Execute o script: CorrecaoRemoverFix.bat
    echo  Depois reinicie a maquina.
)
if "%ACAO%"=="INSTALAR_LOCALDB_2022" (
    echo  Execute o script: CorrecaoInstalarLocalDB2022.bat
)
if "%ACAO%"=="TENTAR_START" (
    echo  Execute: sqllocaldb start MSSQLLocalDB
)
if "%ACAO%"=="NENHUMA" (
    echo  Nenhuma acao necessaria.
)

echo.
pause
