@echo off
chcp 65001 >nul
setlocal enabledelayedexpansion
title ComfyUI Optimize Kurulum - Karakter + Video + FaceSwap

echo.
echo ================================================================
echo   ComfyUI OPTiMiZE KURULUM
echo   Amac: Tutarli karakter, video uretimi, face swap, reklam
echo   GPU:  RTX 4090 (24 GB VRAM)
echo ================================================================
echo.

set "COMFY_DIR=D:\__sistem__\ProgramFiles\ComfyUi\ComfyUI"
if not exist "%COMFY_DIR%\main.py" (
    echo [HATA] ComfyUI bulunamadi. Once 1_ANA_KURULUM.bat calistirin.
    pause
    exit /b 1
)

:: ========================================================
:: BOLUM 1: EKSIK CUSTOM NODE'LAR
:: ========================================================
echo.
echo === [1/5] Eksik custom node'lar kuruluyor ===
cd /d "%COMFY_DIR%\custom_nodes"

:: ReActor - Face swap (en iyi face swap node'u)
if not exist "comfyui-reactor-node" (
    echo   -^> ReActor ^(face swap^) klonlaniyor...
    git clone https://github.com/Gourieff/comfyui-reactor-node.git
) else (
    echo   -^> ReActor zaten kurulu
)

:: PuLID - Karakter tutarliligi (IP-Adapter'dan daha iyi yuz koruma)
if not exist "PuLID_ComfyUI" (
    echo   -^> PuLID ^(karakter tutarliligi^) klonlaniyor...
    git clone https://github.com/cubiq/PuLID_ComfyUI.git
) else (
    echo   -^> PuLID zaten kurulu
)

:: InstantID - Tek fotodan karakter (en stabil)
if not exist "ComfyUI-InstantID" (
    echo   -^> InstantID klonlaniyor...
    git clone https://github.com/cubiq/ComfyUI-InstantID.git
) else (
    echo   -^> InstantID zaten kurulu
)

:: Node bagimliliklari
echo.
echo   Node bagimliliklari yukleniyor...
cd /d "%COMFY_DIR%"
call venv\Scripts\activate.bat

for %%N in (comfyui-reactor-node PuLID_ComfyUI ComfyUI-InstantID) do (
    if exist "custom_nodes\%%N\requirements.txt" (
        echo     -^> %%N
        pip install -r "custom_nodes\%%N\requirements.txt" --quiet --no-warn-script-location
    )
    if exist "custom_nodes\%%N\install.py" (
        python "custom_nodes\%%N\install.py"
    )
)

:: ReActor icin insightface (ozel kurulum gerektirir)
echo   -^> insightface yukleniyor...
pip install insightface==0.7.3 onnx onnxruntime-gpu --quiet --no-warn-script-location

:: sageattention (hiz optimizasyonu)
echo   -^> sageattention yukleniyor...
pip install sageattention --quiet --no-warn-script-location 2>nul

echo.
echo   [OK] Custom node'lar tamamlandi.

:: ========================================================
:: BOLUM 2: ONCELIKLI MODELLER (Karakter + Reklam icin)
:: ========================================================
echo.
echo === [2/5] Oncelikli modeller indiriliyor ===
echo.

:: --- CHECKPOINT: Fotorealistik karakter ---
cd /d "%COMFY_DIR%\models\checkpoints"

if not exist "juggernautXL_v9.safetensors" (
    echo   -^> Juggernaut XL v9 ^(en iyi fotorealistik SDXL^) - 7 GB
    curl -L --progress-bar -o "juggernautXL_v9.safetensors" "https://huggingface.co/RunDiffusion/Juggernaut-XL-v9/resolve/main/Juggernaut-XL_v9_RunDiffusionPhoto_v2.safetensors"
) else (echo   -^> Juggernaut XL v9 zaten var)

if not exist "realvisxlV40.safetensors" (
    echo   -^> RealVisXL V4 ^(portre uzmanı^) - 7 GB
    curl -L --progress-bar -o "realvisxlV40.safetensors" "https://huggingface.co/SG161222/RealVisXL_V4.0/resolve/main/RealVisXL_V4.0.safetensors"
) else (echo   -^> RealVisXL V4 zaten var)

:: --- VAE ---
cd /d "%COMFY_DIR%\models\vae"

if not exist "sdxl_vae.safetensors" (
    echo   -^> SDXL VAE - 300 MB
    curl -L --progress-bar -o "sdxl_vae.safetensors" "https://huggingface.co/stabilityai/sdxl-vae/resolve/main/sdxl_vae.safetensors"
) else (echo   -^> SDXL VAE zaten var)

:: --- IP-ADAPTER (tutarli karakter icin kritik) ---
cd /d "%COMFY_DIR%\models\ipadapter"

if not exist "ip-adapter-plus_sdxl_vit-h.safetensors" (
    echo   -^> IP-Adapter Plus SDXL - 800 MB
    curl -L --progress-bar -o "ip-adapter-plus_sdxl_vit-h.safetensors" "https://huggingface.co/h94/IP-Adapter/resolve/main/sdxl_models/ip-adapter-plus_sdxl_vit-h.safetensors"
) else (echo   -^> IP-Adapter Plus zaten var)

if not exist "ip-adapter-plus-face_sdxl_vit-h.safetensors" (
    echo   -^> IP-Adapter Plus Face SDXL ^(yuz odakli^) - 800 MB
    curl -L --progress-bar -o "ip-adapter-plus-face_sdxl_vit-h.safetensors" "https://huggingface.co/h94/IP-Adapter/resolve/main/sdxl_models/ip-adapter-plus-face_sdxl_vit-h.safetensors"
) else (echo   -^> IP-Adapter Plus Face zaten var)

if not exist "ip-adapter-faceid-plusv2_sdxl.bin" (
    echo   -^> IP-Adapter FaceID Plus V2 SDXL ^(en iyi yuz tutarliligi^) - 800 MB
    curl -L --progress-bar -o "ip-adapter-faceid-plusv2_sdxl.bin" "https://huggingface.co/h94/IP-Adapter-FaceID/resolve/main/ip-adapter-faceid-plusv2_sdxl.bin"
) else (echo   -^> IP-Adapter FaceID Plus V2 zaten var)

:: --- CLIP Vision (IP-Adapter icin sart) ---
cd /d "%COMFY_DIR%\models\clip_vision"

if not exist "CLIP-ViT-H-14-laion2B-s32B-b79K.safetensors" (
    echo   -^> CLIP-ViT-H-14 ^(IP-Adapter icin^) - 3.9 GB
    curl -L --progress-bar -o "CLIP-ViT-H-14-laion2B-s32B-b79K.safetensors" "https://huggingface.co/h94/IP-Adapter/resolve/main/models/image_encoder/model.safetensors"
) else (echo   -^> CLIP-ViT-H-14 zaten var)

:: --- InstantID modelleri ---
if not exist "%COMFY_DIR%\models\instantid" mkdir "%COMFY_DIR%\models\instantid"
cd /d "%COMFY_DIR%\models\instantid"

if not exist "ip-adapter.bin" (
    echo   -^> InstantID IP-Adapter - 1.7 GB
    curl -L --progress-bar -o "ip-adapter.bin" "https://huggingface.co/InstantX/InstantID/resolve/main/ip-adapter.bin"
) else (echo   -^> InstantID IP-Adapter zaten var)

:: --- InstantID ControlNet ---
cd /d "%COMFY_DIR%\models\controlnet"

if not exist "instantid-controlnet.safetensors" (
    echo   -^> InstantID ControlNet - 1.7 GB
    curl -L --progress-bar -o "instantid-controlnet.safetensors" "https://huggingface.co/InstantX/InstantID/resolve/main/ControlNetModel/diffusion_pytorch_model.safetensors"
) else (echo   -^> InstantID ControlNet zaten var)

:: --- ControlNet Union (cok amacli) ---
if not exist "controlnet_union_sdxl_promax.safetensors" (
    echo   -^> ControlNet Union SDXL Promax - 2.5 GB
    curl -L --progress-bar -o "controlnet_union_sdxl_promax.safetensors" "https://huggingface.co/xinsir/controlnet-union-sdxl-1.0/resolve/main/diffusion_pytorch_model_promax.safetensors"
) else (echo   -^> ControlNet Union zaten var)

:: ========================================================
:: BOLUM 3: YUZ ALGILAMA + ONARIM MODELLERI
:: ========================================================
echo.
echo === [3/5] Yuz algilama ve onarim modelleri ===

:: Yolo (yuz/el/kisi tespiti)
cd /d "%COMFY_DIR%\models\ultralytics\bbox"
if not exist "face_yolov8m.pt" (
    echo   -^> face_yolov8m
    curl -L --progress-bar -o "face_yolov8m.pt" "https://huggingface.co/Bingsu/adetailer/resolve/main/face_yolov8m.pt"
) else (echo   -^> face_yolov8m zaten var)

if not exist "hand_yolov8s.pt" (
    echo   -^> hand_yolov8s
    curl -L --progress-bar -o "hand_yolov8s.pt" "https://huggingface.co/Bingsu/adetailer/resolve/main/hand_yolov8s.pt"
) else (echo   -^> hand_yolov8s zaten var)

cd /d "%COMFY_DIR%\models\ultralytics\segm"
if not exist "person_yolov8m-seg.pt" (
    echo   -^> person_yolov8m-seg
    curl -L --progress-bar -o "person_yolov8m-seg.pt" "https://huggingface.co/Bingsu/adetailer/resolve/main/person_yolov8m-seg.pt"
) else (echo   -^> person_yolov8m-seg zaten var)

:: Yuz onarim
cd /d "%COMFY_DIR%\models\facerestore_models"
if not exist "GFPGANv1.4.pth" (
    echo   -^> GFPGAN v1.4
    curl -L --progress-bar -o "GFPGANv1.4.pth" "https://github.com/TencentARC/GFPGAN/releases/download/v1.3.4/GFPGANv1.4.pth"
) else (echo   -^> GFPGAN zaten var)

if not exist "codeformer-v0.1.0.pth" (
    echo   -^> CodeFormer
    curl -L --progress-bar -o "codeformer-v0.1.0.pth" "https://github.com/sczhou/CodeFormer/releases/download/v0.1.0/codeformer.pth"
) else (echo   -^> CodeFormer zaten var)

:: Face swap modeli
cd /d "%COMFY_DIR%\models\insightface"
if not exist "inswapper_128.onnx" (
    echo   -^> inswapper_128 ^(face swap^)
    curl -L --progress-bar -o "inswapper_128.onnx" "https://huggingface.co/ezioruan/inswapper_128.onnx/resolve/main/inswapper_128.onnx"
) else (echo   -^> inswapper_128 zaten var)

:: Upscaler
cd /d "%COMFY_DIR%\models\upscale_models"
if not exist "4x-UltraSharp.pth" (
    echo   -^> 4x-UltraSharp
    curl -L --progress-bar -o "4x-UltraSharp.pth" "https://huggingface.co/Kim2091/UltraSharp/resolve/main/4x-UltraSharp.pth"
) else (echo   -^> 4x-UltraSharp zaten var)

:: SAM (segmentation)
cd /d "%COMFY_DIR%\models\sams"
if not exist "sam_vit_b_01ec64.pth" (
    echo   -^> SAM ViT-B
    curl -L --progress-bar -o "sam_vit_b_01ec64.pth" "https://dl.fbaipublicfiles.com/segment_anything/sam_vit_b_01ec64.pth"
) else (echo   -^> SAM zaten var)

:: ========================================================
:: BOLUM 4: VIDEO MODELLERI
:: ========================================================
echo.
echo === [4/5] Video modelleri ===

cd /d "%COMFY_DIR%\models\diffusion_models"

if not exist "wan2.1_i2v_480p_14B_fp8.safetensors" (
    echo   -^> Wan 2.1 I2V 14B FP8 ^(en iyi image-to-video^) - 14 GB
    curl -L --progress-bar -o "wan2.1_i2v_480p_14B_fp8.safetensors" "https://huggingface.co/Kijai/WanVideo_comfy/resolve/main/Wan2_1-I2V-14B-480P_fp8_e4m3fn.safetensors"
) else (echo   -^> Wan 2.1 I2V zaten var)

if not exist "wan2.1_t2v_14B_fp8.safetensors" (
    echo   -^> Wan 2.1 T2V 14B FP8 ^(text-to-video^) - 14 GB
    curl -L --progress-bar -o "wan2.1_t2v_14B_fp8.safetensors" "https://huggingface.co/Kijai/WanVideo_comfy/resolve/main/Wan2_1-T2V-14B_fp8_e4m3fn.safetensors"
) else (echo   -^> Wan 2.1 T2V zaten var)

:: Wan 2.1 icin CLIP modelleri
cd /d "%COMFY_DIR%\models\clip"

if not exist "umt5-xxl-enc-bf16.safetensors" (
    echo   -^> UMT5-XXL ^(Wan video text encoder^) - 9 GB
    curl -L --progress-bar -o "umt5-xxl-enc-bf16.safetensors" "https://huggingface.co/Kijai/WanVideo_comfy/resolve/main/umt5-xxl-enc-bf16.safetensors"
) else (echo   -^> UMT5-XXL zaten var)

:: Wan 2.1 icin VAE
cd /d "%COMFY_DIR%\models\vae"

if not exist "wan_2.1_vae.safetensors" (
    echo   -^> Wan 2.1 VAE - 300 MB
    curl -L --progress-bar -o "wan_2.1_vae.safetensors" "https://huggingface.co/Kijai/WanVideo_comfy/resolve/main/Wan2_1_VAE_bf16.safetensors"
) else (echo   -^> Wan VAE zaten var)

:: Wan 2.1 icin CLIP Vision
cd /d "%COMFY_DIR%\models\clip_vision"

if not exist "clip_vision_h_wan.safetensors" (
    echo   -^> CLIP Vision H ^(Wan I2V icin^) - 3.9 GB
    curl -L --progress-bar -o "clip_vision_h_wan.safetensors" "https://huggingface.co/Kijai/WanVideo_comfy/resolve/main/clip_vision_h.safetensors"
) else (echo   -^> CLIP Vision H Wan zaten var)

:: ========================================================
:: BOLUM 5: BASLAT SCRIPTI OPTIMIZE
:: ========================================================
echo.
echo === [5/5] Son ayarlar ===

:: extra_model_paths.yaml olustur (model paylasimi icin)
echo.
echo [OK] Tum modeller ve node'lar kuruldu!

echo.
echo ================================================================
echo   KURULUM TAMAMLANDI!
echo ================================================================
echo.
echo   Toplam indirilen: yaklasik 70 GB
echo.
echo   Kurulu modeller:
echo     Checkpoint : Juggernaut XL v9, RealVisXL V4
echo     IP-Adapter : Plus, Plus Face, FaceID Plus V2
echo     InstantID  : IP-Adapter + ControlNet
echo     ControlNet : Union SDXL Promax
echo     Video      : Wan 2.1 I2V 14B, Wan 2.1 T2V 14B
echo     FaceSwap   : inswapper_128 (ReActor)
echo     Yuz Onarim : GFPGAN, CodeFormer
echo     Upscaler   : 4x-UltraSharp
echo     Algilama   : face_yolov8m, hand_yolov8s, person_yolov8m
echo.
echo   Baslatmak icin: 3_COMFYUI_BASLAT.bat
echo ================================================================
echo.
pause
endlocal
