add_executable(fikocad WIN32
  main.cpp
  belge_penceresi.cpp
  acilis_splash.cpp
  surec_kopru.cpp
  surec_yonetici_panel.cpp
  orkestra_kule.cpp
  orkestra_soket_win.cpp
  orkestra_metrik.cpp
  orkestra_tcp_win.cpp
  orkestra_kripto.cpp
  istakip_ag.cpp
  istakip_servis.cpp
  belge.cpp
  belge_ciz.cpp
  isin_alani.cpp
  belge_yonetici.cpp
  ayar_kalici.cpp
  ui_ortak.cpp
  dosya_islemleri.cpp
  oto_kayit.cpp
  pafta_ciz.cpp
  pmi_ciz.cpp
  malzeme_gpu.cpp
  malzeme_nesnesi.cpp
  malzeme_io.cpp
  malzeme_penceresi.cpp
  zeka_penceresi.cpp
  istakip_sema.cpp
  istakip_sema_penceresi.cpp
  istakip_filtre.cpp
  istakip_gorunum.cpp
  istakip_gantt.cpp
  istakip_grafik.cpp
  istakip_penceresi.cpp
  istakip_kayit_penceresi.cpp
  ozellikler_paneli.cpp
  yardimci_penceler.cpp
  kinematik_agac.cpp
  kinematik_penceresi.cpp
  urun_agaci_paneli.cpp
  isik_penceresi.cpp
  sketch_ui.cpp
  cam_paneli.cpp
  cam_operasyon_penceresi.cpp
  cam_simulasyon_penceresi.cpp
  sim_ses.cpp
  kutuk_async.cpp
  cam_parca_op_penceresi.cpp
  cam_takim_penceresi.cpp
  cam_takim_ekseni_penceresi.cpp
  cam_urun_agaci.cpp
  cam_strateji_semasi.cpp
  cam_makro_onizleme.cpp
  baglam_hud.cpp
  baglam_menu.cpp
  arama_menu.cpp
  durum_cubugu.cpp
  feature_penceresi.cpp
  hover_karti.cpp
  olcum_penceresi.cpp
  perf_hud.cpp
  sahne_overlay.cpp
  akilli_secim.cpp
  makro_oneri.cpp
  kafa_penceresi.cpp
  yardim.cpp
  dinamik_komut_penceresi.cpp
  guncelleme_kontrol.cpp
  guncelleme_indir.cpp
  guncelleme_penceresi.cpp
  geri_bildirim.cpp
  geri_bildirim_penceresi.cpp
  referans_penceresi.cpp
  gsd_penceresi.cpp
  hizli3d_penceresi.cpp
  workbench_secici.cpp
  kontrol_merkezi.cpp
  sistem_metrik.cpp
  analiz_penceresi.cpp
  analiz_urun_agaci.cpp
  fark_tur.cpp
  fark_panel.cpp
  fark_karsilastirma.cpp
  dokum_penceresi.cpp
  strafor_penceresi.cpp
  agirlik_penceresi.cpp
  ayarlar_penceresi.cpp
  arac_kayitlari.cpp
  ayar_kayitlari.cpp
  lisans_kimlikler.cpp
  lisans_yukle.cpp
  lisans_uzak.cpp
  lisans_canli.cpp
  context_pick_ui.cpp
  context_pick_ui.hpp
  windows_surum.cpp
  sanal_masaustu.cpp
  catia_kesif.cpp
  calisma_alani_plan.cpp
  calisma_alani_penceresi.cpp
  com_sunucu.cpp
  catia_makro.cpp
)
# --- Lisans Uretici arayuzu: MUSTERI SURUMUNDE DERLENMEZ ---
# Calisma-zamani gizleme (menu komutunu kaydetmemek) YETMEZ: kod musteri
# ikilisinde kalirsa lisans formati/uretim akisi tersine muhendislige acik olur ve
# bir saldirgan hazir arayuzu binary yamasiyla acabilir. Bu yuzden kaynak DOSYA
# yalnizca uretici makinede derlenir:  cmake -DFIKO_URETICI_UI=ON
option(FIKO_URETICI_UI "Lisans Uretici arayuzunu derle (YALNIZ uretici makine)" OFF)
if(FIKO_URETICI_UI)
  target_sources(fikocad PRIVATE lisans_uretici_penceresi.cpp)
  target_compile_definitions(fikocad PRIVATE FIKO_URETICI_UI)
endif()

target_link_libraries(fikocad PRIVATE fiko::core fiko::orkestra fiko::istakip fiko::girdi fiko::baglam fiko::platform fiko::render fiko::sahne fiko::malzeme fiko::parca fiko::parametre fiko::gsd fiko::ui fiko::betik fiko::eklenti fiko::cam fiko::analiz fiko::zeka fiko::dokum fiko::kutuk fiko::strafor fiko::ayar fiko::io fiko::cae fiko::kinematik fiko::simdjson comdlg32 winhttp bcrypt pdh dxgi shell32 winmm ws2_32 ole32 oleaut32 uuid oleacc advapi32)

# Yigin (stack) rezervini varsayilan 1 MB'dan 16 MB'a yukselt. GorevSistemi worker
# thread'leri (std::thread, dwStackSize=0) Windows'ta PE basligindaki SizeOfStackReserve
# degerini DEVRALIR — bu yuzden linker seviyesinde ayarlamak TUM thread'leri kapsar.
# NEDEN: montaj hiyerarsisi DFS'i (hiyerarsiGez, brep_io.cpp) derin/agir OCCT
# nesneleriyle her seviyede genis bir cerceve kullanir; bazi gercek STEP'lerde
# (bkz. 17778_a09013_m01_01.stp teshisi) HIYERARSI_MAKS_DERINLIK (300) sinirina
# ulasmadan varsayilan 1 MB yigin tukeniyordu. occtSinyalKur()/OSD::SetSignal bunu
# GUVENILIR YAKALAYAMAZ (gercek stack-overflow SEH'i, _resetstkoflw olmadan devam
# eden ilk derin cagride "resource deadlock would occur" gibi ikincil bir CRT
# hatasina donusuyordu). Derinlik/cevrim guard'i (brep_io.cpp) hala PATOLOJIK/
# cevrimsel montajlara karsi asil savunma; bu, gercek-ama-agir montajlar icin ek pay.
if(MSVC)
  target_link_options(fikocad PRIVATE "/STACK:16777216,1048576")
endif()

# Onceden derlenmis basliklar (PCH): en agir/stabil STL basliklari + core/temel.hpp
# tek sefer derlenir → fikocad'in ~40 TU'sunda tekrar tekrar parse edilmez (buyuk
# derleme kazanci). Set stabil tutulmali (sik degisen baslik PCH'ye KONMAZ).
target_precompile_headers(fikocad PRIVATE
  <vector> <string> <memory> <functional> <unordered_map> <algorithm>
  "${CMAKE_SOURCE_DIR}/motor/core/include/fiko/core/temel.hpp")

# --- CEF (Chromium Embedded Framework) gomulu yardim goruntuleyici ---
# Varsayilan KAPALI (SDK gerektirir). Acmak: cmake -DFIKO_CEF=ON.
# Runtime: yalniz gerekli DLL'ler exe yanina kopyalanir; CEF'in vulkan-1.dll /
# vk_swiftshader'i KOPYALANMAZ (fikocad'in Vulkan loader'iyla cakismasin). Resources
# CefSettings ile SDK'dan gosterilir (kopya yok). Wrapper /MD ile derlenmis olmali.
option(FIKO_CEF "Gomulu CEF yardim goruntuleyici (CEF SDK gerekir)" OFF)
if(FIKO_CEF)
  if(NOT CEF_ROOT)
    set(CEF_ROOT "D:/__sistem__/ProgramFiles/cef/cef_binary_150.0.11+gb887805+chromium-150.0.7871.115_windows64"
        CACHE PATH "CEF SDK koku")
  endif()
  target_sources(fikocad PRIVATE yardim_cef.cpp yardim_penceresi.cpp)
  target_compile_definitions(fikocad PRIVATE FIKO_CEF FIKO_CEF_ROOT="${CEF_ROOT}")
  target_include_directories(fikocad PRIVATE "${CEF_ROOT}")
  target_link_libraries(fikocad PRIVATE
    "${CEF_ROOT}/Release/libcef.lib"
    "${CEF_ROOT}/build_md/libcef_dll_wrapper/libcef_dll_wrapper.lib")
  # Gerekli runtime DLL'leri (vulkan-1.dll / vk_swiftshader* / libcef.lib HARIC).
  set(CEF_RUNTIME libcef.dll chrome_elf.dll d3dcompiler_47.dll dxcompiler.dll dxil.dll
                  libEGL.dll libGLESv2.dll v8_context_snapshot.bin bootstrap.exe bootstrapc.exe)
  foreach(f ${CEF_RUNTIME})
    add_custom_command(TARGET fikocad POST_BUILD
      COMMAND ${CMAKE_COMMAND} -E copy_if_different
              "${CEF_ROOT}/Release/${f}" "$<TARGET_FILE_DIR:fikocad>/${f}"
      COMMENT "CEF runtime: ${f}")
  endforeach()
  # Resources (icudtl.dat + *.pak) exe YANINA — ICU init exe-yani duz yerlesim ister
  # (resources_dir_path ICU'dan sonra uygulaniyor → fast-fail). Bunlar VERI dosyasi (DLL
  # degil) → cakisma yok.
  set(CEF_RES icudtl.dat chrome_100_percent.pak chrome_200_percent.pak resources.pak)
  foreach(f ${CEF_RES})
    add_custom_command(TARGET fikocad POST_BUILD
      COMMAND ${CMAKE_COMMAND} -E copy_if_different
              "${CEF_ROOT}/Resources/${f}" "$<TARGET_FILE_DIR:fikocad>/${f}"
      COMMENT "CEF resource: ${f}")
  endforeach()
  add_custom_command(TARGET fikocad POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy_directory_if_different
            "${CEF_ROOT}/Resources/locales" "$<TARGET_FILE_DIR:fikocad>/locales"
    COMMENT "CEF locales")
endif()

# --- App-katmani saf protokol testleri (Win32/olay-notr; ag yok) ---
add_executable(fikocad_surec_test
  test/test_main.cpp
  test/test_surec_kopru.cpp
  test/test_orkestra_kule.cpp
  test/test_orkestra_soket.cpp
  test/test_orkestra_metrik.cpp
  test/test_orkestra_tcp.cpp
  test/test_orkestra_eslesme_koprusu.cpp
  test/test_istakip_ag.cpp
  orkestra_soket_win.cpp
  orkestra_metrik.cpp
  orkestra_tcp_win.cpp
  orkestra_kripto.cpp
  istakip_ag.cpp
  test/test_geri_bildirim.cpp
  test/test_makro_oneri.cpp
  test/test_kinematik_io.cpp
  test/test_kinematik_agac.cpp
  kinematik_agac.cpp
  makro_oneri.cpp
)
target_include_directories(fikocad_surec_test PRIVATE
  ${CMAKE_CURRENT_SOURCE_DIR}
  ${CMAKE_SOURCE_DIR}/motor/core/include   # temel.hpp (u8/u32) — saf tip takimi
  ${CMAKE_SOURCE_DIR}/motor/cekirdek/include  # AgacDugum (kinematik_agac saglayicisi)
  ${CMAKE_SOURCE_DIR}/motor/core/test)
# kinematik_io.hpp saf cevirisi (mekanizma <-> .fikocad POD) burada test edilir.
target_link_libraries(fikocad_surec_test PRIVATE fiko::kinematik fiko::io fiko::orkestra fiko::istakip ws2_32 dxgi bcrypt)
add_test(NAME surec_kopru COMMAND fikocad_surec_test)

# OCCT calisma zamani DLL'leri exe yanina kopyalanir (yalniz degisenler)
add_custom_command(TARGET fikocad POST_BUILD
  COMMAND ${CMAKE_COMMAND} -E copy_directory_if_different
          "${FIKO_VCPKG}/bin" "$<TARGET_FILE_DIR:fikocad>"
  COMMENT "OCCT DLL'leri kopyalaniyor")

# Ornek makrolar exe yanindaki makrolar/ dizinine kopyalanir (Makro Konsolu okur)
add_custom_command(TARGET fikocad POST_BUILD
  COMMAND ${CMAKE_COMMAND} -E copy_directory_if_different
          "${CMAKE_CURRENT_SOURCE_DIR}/makrolar" "$<TARGET_FILE_DIR:fikocad>/makrolar"
  COMMENT "Ornek makrolar kopyalaniyor")

# Arka plan gorseli (3D gorunum bulut+logo) exe yanindaki resimler/ dizinine kopyalanir
add_custom_command(TARGET fikocad POST_BUILD
  COMMAND ${CMAKE_COMMAND} -E copy_directory_if_different
          "${CMAKE_CURRENT_SOURCE_DIR}/resimler" "$<TARGET_FILE_DIR:fikocad>/resimler"
  COMMENT "Arka plan gorselleri kopyalaniyor")

# Kafa (Diagonal/Ozmo) VRML modelleri exe yanindaki assets/3d dizinine kopyalanir
# (kafa_penceresi.cpp'deki kafaAssetKok() exe-yanini once arar; boylece proje baska
# bir PC'ye/klasore tasinsa bile modeller bulunur — bkz. yardim.cpp'deki ayni kalip).
add_custom_command(TARGET fikocad POST_BUILD
  COMMAND ${CMAKE_COMMAND} -E copy_directory_if_different
          "${CMAKE_SOURCE_DIR}/assets/3d" "$<TARGET_FILE_DIR:fikocad>/assets/3d"
  COMMENT "Kafa 3D modelleri (Diagonal/Ozmo) kopyalaniyor")

# Yardim dokumanlari exe yanindaki assets/yardim dizinine kopyalanir (yardim.cpp'deki
# yardimKok() exe-yanini once arar; ayni tasima sorunu bunda da vardi).
add_custom_command(TARGET fikocad POST_BUILD
  COMMAND ${CMAKE_COMMAND} -E copy_directory_if_different
          "${CMAKE_SOURCE_DIR}/assets/yardim" "$<TARGET_FILE_DIR:fikocad>/assets/yardim"
  COMMENT "Yardim dokumanlari kopyalaniyor")

set(GLSLC "${FIKO_VULKAN_SDK}/Bin/glslc.exe")
set(SHADER_KAYNAK ${CMAKE_SOURCE_DIR}/motor/render/shader)
set(SHADER_CIKTI ${CMAKE_CURRENT_BINARY_DIR}/shader)
file(MAKE_DIRECTORY ${SHADER_CIKTI})

set(SPV_DOSYALAR "")
foreach(S model.vert model.frag secim.vert secim.frag
          kenar.vert kenar.frag nokta.vert nokta.frag
          analiz.vert analiz.frag wall.comp golge.vert golge.frag
          zebra.frag reflect.frag
          kesit_sayim.vert kesit_sayim.frag kesit_dolgu.vert kesit_dolgu.frag
          peek.vert peek.frag peek_kenar.vert peek_kenar.frag
          fikoui.vert fikoui_glow.frag fikoui_aurora.frag
          kutuk_dexel_kes.comp sdf_kes.comp sdf_mc.comp
          katilasma_fdm.comp fark_enyakin.comp
          sph_hash_bucket.comp
          sph_yogunluk.comp sph_kuvvet.comp sph_entegre.comp)
  add_custom_command(
    OUTPUT ${SHADER_CIKTI}/${S}.spv
    COMMAND ${GLSLC} ${SHADER_KAYNAK}/${S} -O -o ${SHADER_CIKTI}/${S}.spv
    DEPENDS ${SHADER_KAYNAK}/${S}
    COMMENT "SPIR-V derleniyor: ${S}")
  list(APPEND SPV_DOSYALAR ${SHADER_CIKTI}/${S}.spv)
endforeach()

add_custom_target(fikocad_shaderler DEPENDS ${SPV_DOSYALAR})
add_dependencies(fikocad fikocad_shaderler)
