@echo off
setlocal enabledelayedexpansion

REM === AYARLAR ===
set CERT_DIR=D:\__sistem__\Masaustu\FikoYT.Yeni.Cag\merkez.go-server.com\cert\mongo
set MONGO_DIR=D:\__sistem__\Masaustu\FikoYT.Yeni.Cag\_VT_\mongo-8.0.4\bin
set DATA_DIR=D:\__sistem__\Masaustu\FikoYT.Yeni.Cag\_VT_\data-8.0.4
set LOG_FILE=D:\__sistem__\Masaustu\FikoYT.Yeni.Cag\_VT_\mongo.log
set MONGO_ADMIN_USER=fikoyt
set MONGO_ADMIN_PASS=@@++1299++@@
set MONGO_SHELL=%MONGO_DIR%\mongosh.exe
set MONGO_PORT=9001
set REPLICA_SET_NAME=rs0
set KEYFILE=%CERT_DIR%\secret-mongo.txt

REM === KEYFILE OLUŞTUR (replika auth için) ===
if not exist "%KEYFILE%" (
  echo [*] KeyFile bulunamadi, olusturuluyor...
  powershell -Command "Add-Content -Path '%KEYFILE%' -Value '@@++1299@@'"
)

REM === SAN CONFIG DOSYASI OLUŞTUR ===
echo [req] > "%CERT_DIR%\san.cnf"
echo distinguished_name=req_distinguished_name >> "%CERT_DIR%\san.cnf"
echo req_extensions=req_ext >> "%CERT_DIR%\san.cnf"
echo [req_distinguished_name] >> "%CERT_DIR%\san.cnf"
echo [req_ext] >> "%CERT_DIR%\san.cnf"
echo subjectAltName=DNS:fikoyt.com,IP:127.0.0.1 >> "%CERT_DIR%\san.cnf"

REM === SERTIFIKALARI OLUŞTUR ===
if not exist "%CERT_DIR%\ca.crt" (
  echo [*] Sertifikalar olusturuluyor...
  D:\__sistem__\ProgramFiles\Git\usr\bin\openssl.exe genrsa -out "%CERT_DIR%\ca.key" 4096
  D:\__sistem__\ProgramFiles\Git\usr\bin\openssl.exe req -x509 -new -nodes -key "%CERT_DIR%\ca.key" -sha256 -days 3650 -out "%CERT_DIR%\ca.crt" -subj "/C=TR/ST=TR/L=Istanbul/O=FikoYT/CN=FikoYT Root CA"
  D:\__sistem__\ProgramFiles\Git\usr\bin\openssl.exe genrsa -out "%CERT_DIR%\server.key" 4096

  REM CSR oluştururken san.cnf kullan
  D:\__sistem__\ProgramFiles\Git\usr\bin\openssl.exe req -new -key "%CERT_DIR%\server.key" -out "%CERT_DIR%\server.csr" -subj "/C=TR/ST=TR/L=Istanbul/O=FikoYT/CN=fikoyt.com" -config "%CERT_DIR%\san.cnf" -extensions req_ext

  REM Sertifikayı imzalarken de san.cnf kullan
  D:\__sistem__\ProgramFiles\Git\usr\bin\openssl.exe x509 -req -in "%CERT_DIR%\server.csr" -CA "%CERT_DIR%\ca.crt" -CAkey "%CERT_DIR%\ca.key" -CAcreateserial -out "%CERT_DIR%\server.crt" -days 3650 -sha256 -extfile "%CERT_DIR%\san.cnf" -extensions req_ext
)

REM === PEM dosyasını oluştur ===
echo [*] PEM dosyasi olusturuluyor...
type "%CERT_DIR%\server.crt" "%CERT_DIR%\server.key" > "%CERT_DIR%\mongo-cert.pem"

REM === mongod başlat ===
echo [*] MongoDB baslatiliyor...
start "" "%MONGO_DIR%\mongod.exe" ^
  --dbpath "%DATA_DIR%" ^
  --replSet %REPLICA_SET_NAME% ^
  --port %MONGO_PORT% ^
  --bind_ip 0.0.0.0 ^
  --auth ^
  --tlsMode requireTLS ^
  --tlsCertificateKeyFile "%CERT_DIR%\mongo-cert.pem" ^
  --tlsCAFile "%CERT_DIR%\ca.crt" ^
  --keyFile "%KEYFILE%" ^
  --logpath "%LOG_FILE%" --logappend

REM === PORT HAZIR MI KONTROL ET ===
echo [*] MongoDB'nin baslamasi bekleniyor...
set RETRIES=0
:wait_loop
  timeout /t 2 >nul
  set /a RETRIES+=1
  powershell -Command "(Get-NetTCPConnection -LocalPort %MONGO_PORT% -State Listen -ErrorAction SilentlyContinue) -ne $null" >nul
  if !errorlevel! EQU 0 goto port_ready
  if !RETRIES! GEQ 15 goto check_logs
goto wait_loop

:port_ready
echo [+] MongoDB portu dinlemede.

REM === replika set başlat ===
echo [*] Replika set baslatiliyor...
echo rs.initiate() > "%CERT_DIR%\rs_initiate.js"
"%MONGO_SHELL%" --host 127.0.0.1 --port %MONGO_PORT% ^
  --tls ^
  --tlsCAFile "%CERT_DIR%\ca.crt" ^
  --tlsCertificateKeyFile "%CERT_DIR%\mongo-cert.pem" ^
  admin "%CERT_DIR%\rs_initiate.js"

REM === create_admin.js dosyasını oluştur ===
echo db.createUser({user: "%MONGO_ADMIN_USER%", pwd: "%MONGO_ADMIN_PASS%", roles: [{role: "root", db: "admin"}]}); > "%CERT_DIR%\create_admin.js"

REM === Admin kullanıcıyı ekle ===
echo [*] Admin kullanici ekleniyor...
"%MONGO_SHELL%" --host 127.0.0.1 --port %MONGO_PORT% ^
  --tls ^
  --tlsCAFile "%CERT_DIR%\ca.crt" ^
  --tlsCertificateKeyFile "%CERT_DIR%\mongo-cert.pem" ^
  admin "%CERT_DIR%\create_admin.js"

if %ERRORLEVEL% NEQ 0 (
  echo [!] Kullanici eklenemedi. Hata kodu: %ERRORLEVEL%
  goto check_logs
)

echo [+] Admin kullanici basariyla eklendi.
goto end

:check_logs
echo.
echo [!] Mongo log dosyasi okunuyor...
echo -------------------------------
type "%LOG_FILE%" | findstr /i /c:"ERROR" /c:"FAIL" /c:"TLS" /c:"bind"
echo -------------------------------
echo [!] Hatalar yukarida goruldu. Lütfen inceleyin.

:end
pause
endlocal
