@echo off
chcp 65001 >nul
title Face Swap Uygula - FaceFusion
setlocal enabledelayedexpansion

set "PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True"

set "BASE_DIR=%~dp0"
set "FACEFUSION_DIR=%BASE_DIR%FaceFusion"
set "FF_PYTHON=%FACEFUSION_DIR%\venv\Scripts\python.exe"
set "FF_SCRIPT=%FACEFUSION_DIR%\facefusion\facefusion.py"

set "VIDEO="
set "FACEIMG="

echo =========================================================
echo    FACE SWAP UYGULA - FaceFusion
echo    Video + Yuz Resmi = Face Swap Video
echo =========================================================
echo.

rem --- Surukle birak dosyalari ayikla ---
for %%A in (%*) do (
    set "EXT=%%~xA"
    if /i "!EXT!"==".mp4" set "VIDEO=%%~A"
    if /i "!EXT!"==".avi" set "VIDEO=%%~A"
    if /i "!EXT!"==".mkv" set "VIDEO=%%~A"
    if /i "!EXT!"==".mov" set "VIDEO=%%~A"
    if /i "!EXT!"==".webm" set "VIDEO=%%~A"
    if /i "!EXT!"==".png" set "FACEIMG=%%~A"
    if /i "!EXT!"==".jpg" set "FACEIMG=%%~A"
    if /i "!EXT!"==".jpeg" set "FACEIMG=%%~A"
    if /i "!EXT!"==".webp" set "FACEIMG=%%~A"
    if /i "!EXT!"==".bmp" set "FACEIMG=%%~A"
)

rem --- Eksik dosyalari sor ---
if "!VIDEO!"=="" (
    echo [!] Video dosyasi bulunamadi.
    echo     Video ve yuz resmini bu bat ustune surukleyip birakin.
    echo.
    set /p VIDEO="  Video yolu [mp4/avi/mkv]: "
)

if "!FACEIMG!"=="" (
    echo.
    echo [!] Yuz resmi bulunamadi.
    set /p FACEIMG="  Yuz resmi yolu [png/jpg]: "
)

if "!VIDEO!"=="" (
    echo HATA: Video dosyasi gerekli!
    pause
    exit /b 1
)
if "!FACEIMG!"=="" (
    echo HATA: Yuz resmi gerekli!
    pause
    exit /b 1
)

rem --- FaceFusion kontrol ---
if not exist "%FF_PYTHON%" (
    echo.
    echo HATA: FaceFusion kurulu degil!
    echo Beklenen: %FF_PYTHON%
    echo Once FaceFusion-Kur.bat calistirin.
    pause
    exit /b 1
)

rem --- Script kontrol ---
if not exist "%FF_SCRIPT%" set "FF_SCRIPT=%FACEFUSION_DIR%\facefusion\run.py"
if not exist "!FF_SCRIPT!" (
    echo HATA: FaceFusion script bulunamadi!
    pause
    exit /b 1
)

echo.
echo   Video    : !VIDEO!
echo   Yuz Resmi: !FACEIMG!
echo.

rem --- Kalite secimi ---
echo   Kalite secin:
echo     1] Hizli  - Dusuk kalite, hizli [Varsayilan]
echo     2] Dengeli - Orta kalite
echo     3] Kaliteli - Yuksek kalite, yavas
echo.
set /p QUALCHOICE="  Seciminiz [1/2/3, Enter=1]: "
if "!QUALCHOICE!"=="" set "QUALCHOICE=1"

set "FACE_SCORE=0.5"
set "VID_QUALITY=90"
if "!QUALCHOICE!"=="1" set "FACE_SCORE=0.4" & set "VID_QUALITY=85"
if "!QUALCHOICE!"=="2" set "FACE_SCORE=0.5" & set "VID_QUALITY=90"
if "!QUALCHOICE!"=="3" set "FACE_SCORE=0.6" & set "VID_QUALITY=95"

rem --- Temp cikis dosya adi (saf ASCII, sorun olmaz) ---
set "TEMP_OUTPUT=%TEMP%\faceswap_temp.mp4"

rem --- Gercek cikis dosya adi (orijinal video adina gore) ---
for %%F in ("!VIDEO!") do (
    set "VIDNAME=%%~nF"
    set "VIDEXT=%%~xF"
)
if not exist "%BASE_DIR%output" mkdir "%BASE_DIR%output"
set "FINAL_OUTPUT=%BASE_DIR%output\!VIDNAME!_faceswap!VIDEXT!"

rem --- CUDA DLL PATH ayarla ---
set "EXTRA_PATH=%FACEFUSION_DIR%\venv\Scripts"
set "NVIDIA_PKG=%FACEFUSION_DIR%\venv\Lib\site-packages\nvidia"
for /d %%D in ("%NVIDIA_PKG%\*") do (
    if exist "%%D\bin" set "EXTRA_PATH=!EXTRA_PATH!;%%D\bin"
    if exist "%%D\lib" set "EXTRA_PATH=!EXTRA_PATH!;%%D\lib"
)
set "CUDA_BIN=C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.6\bin"
if exist "%CUDA_BIN%" set "EXTRA_PATH=!EXTRA_PATH!;%CUDA_BIN%"
set "PATH=!EXTRA_PATH!;%PATH%"

echo.
echo =========================================================
echo   Face Swap baslatiliyor...
echo   Bu islem video uzunluguna gore birkac dakika surebilir
echo =========================================================
echo.

rem --- cwd FaceFusion/facefusion olmali, yoksa processors bos doner ---
cd /d "%FACEFUSION_DIR%\facefusion"

rem --- Onceki temp dosyasini temizle ---
if exist "!TEMP_OUTPUT!" del "!TEMP_OUTPUT!"

rem --- FaceFusion calistir (temp yoluna yaz) ---
"%FF_PYTHON%" "!FF_SCRIPT!" headless-run --source-paths "!FACEIMG!" --target-path "!VIDEO!" --output-path "!TEMP_OUTPUT!" --processors face_swapper --execution-providers cuda --face-selector-mode one --face-detector-score !FACE_SCORE! --output-video-quality !VID_QUALITY! --temp-frame-format png

echo.
if exist "!TEMP_OUTPUT!" (
    echo [+] FaceFusion tamamlandi, dosya kopyalaniyor...
    copy /y "!TEMP_OUTPUT!" "!FINAL_OUTPUT!" >nul 2>&1
    if exist "!FINAL_OUTPUT!" (
        del "!TEMP_OUTPUT!"
        echo =========================================================
        echo   BASARILI! Face swap tamamlandi!
        echo   Cikis: !FINAL_OUTPUT!
        echo =========================================================
        echo.
        set /p OPENVID="  Videoyu acmak ister misiniz? [E/H]: "
        if /i "!OPENVID!"=="E" start "" "!FINAL_OUTPUT!"
    ) else (
        echo =========================================================
        echo   UYARI: Kopyalama basarisiz!
        echo   Temp dosya burada: !TEMP_OUTPUT!
        echo =========================================================
    )
) else (
    echo =========================================================
    echo   HATA: Face swap basarisiz oldu!
    echo   Video olusturulamadi.
    echo =========================================================
)

echo.
pause
