# clang might need _LIBCPP_ENABLE_CXX26_REMOVED_CODECVT

project('raycaster', 'cpp',
  version: '0.1.0',
  default_options: [
    'cpp_std=c++20',
    'cpp_args=-D_GLIBCXX_DEBUG=1 -D_GLIBCXX_DEBUG_PEDANTIC=1',
  ])

# use this for common options only for our executables
cpp_args=[]
link_args=[]
# these are passed as override_defaults
exe_defaults = [ 'warning_level=2' ]

cc = meson.get_compiler('cpp')
dependencies = []

if build_machine.system() == 'windows'
  add_global_link_arguments(
    '-static-libgcc',
    '-static-libstdc++',
    '-static',
    language: 'cpp',
  )

  sfml_main = dependency('sfml_main')
  opengl32 = cc.find_library('opengl32', required: true)
  winmm = cc.find_library('winmm', required: true)
  gdi32 = cc.find_library('gdi32', required: true)

  dependencies += [
      opengl32, winmm, gdi32, sfml_main
  ]
  exe_defaults += ['werror=true']

elif build_machine.system() == 'darwin'
  add_global_link_arguments(
    language: 'cpp',
  )

  opengl = dependency('OpenGL')
  corefoundation = dependency('CoreFoundation')
  carbon = dependency('Carbon')
  cocoa = dependency('Cocoa')
  iokit = dependency('IOKit')
  corevideo = dependency('CoreVideo')

  link_args += ['-ObjC']
  exe_defaults += ['werror=false']
  dependencies += [
    opengl, corefoundation, carbon, cocoa, iokit, corevideo
  ]
endif

catch2 = dependency('catch2-with-main')
fmt = subproject('fmt').get_variable('fmt_dep')
json = dependency('nlohmann_json')
freetype2 = dependency('freetype2')

flac = dependency('flac')
ogg = dependency('ogg')
vorbis = dependency('vorbis')
vorbisfile = dependency('vorbisfile')
vorbisenc = dependency('vorbisenc')
sfml_audio = dependency('sfml_audio')
sfml_graphics = dependency('sfml_graphics')
sfml_network = dependency('sfml_network')
sfml_system = dependency('sfml_system')
sfml_window = dependency('sfml_window',
  default_options: ['default_library=shared'])

dependencies += [
  fmt, json, freetype2,
  flac, ogg, vorbis, vorbisfile, vorbisenc,
  sfml_audio, sfml_graphics,
  sfml_network, sfml_system,
  sfml_window
]

sources = [
  'ai.cpp',
  'ai_debug.cpp',
  'animation.cpp',
  'animation.cpp',
  'autowalker.cpp',
  'battle.cpp',
  'boss_fight_ui.cpp',
  'camera.cpp',
  'combat.cpp',
  'combat_ui.cpp',
  'components.cpp',
  'config.cpp',
  'dbc.cpp',
  'debug_ui.cpp',
  'devices.cpp',
  'goap.cpp',
  'guecs.cpp',
  'gui_fsm.cpp',
  'inventory.cpp',
  'lel.cpp',
  'levelmanager.cpp',
  'lights.cpp',
  'main_ui.cpp',
  'map.cpp',
  'map_view.cpp',
  'matrix.cpp',
  'matrix.cpp',
  'mini_map.cpp',
  'overlay_ui.cpp',
  'pathing.cpp',
  'rand.cpp',
  'raycaster.cpp',
  'ritual_ui.cpp',
  'rituals.cpp',
  'save.cpp',
  'shaders.cpp',
  'shiterator.hpp',
  'sound.cpp',
  'spatialmap.cpp',
  'stats.cpp',
  'status_ui.cpp',
  'systems.cpp',
  'textures.cpp',
  'tilemap.cpp',
  'worldbuilder.cpp',
]

executable('runtests', sources + [
  'tests/ai.cpp',
  'tests/animation.cpp',
  'tests/base.cpp',
  'tests/battle.cpp',
  'tests/components.cpp',
  'tests/config.cpp',
  'tests/dbc.cpp',
  'tests/dinkyecs.cpp',
  'tests/easings.cpp',
  'tests/fsm.cpp',
  'tests/guecs.cpp',
  'tests/inventory.cpp',
  'tests/lel.cpp',
  'tests/levelmanager.cpp',
  'tests/lighting.cpp',
  'tests/map.cpp',
  'tests/matrix.cpp',
  'tests/pathing.cpp',
  'tests/rituals.cpp',
  'tests/shaders.cpp',
  'tests/sound.cpp',
  'tests/spatialmap.cpp',
  'tests/stats.cpp',
  'tests/textures.cpp',
  'tests/tilemap.cpp',
  ],
  cpp_args: cpp_args,
  link_args: link_args,
  override_options: exe_defaults,
  dependencies: dependencies + [catch2])


executable('zedcaster',
  sources + [ 'main.cpp' ],
  cpp_args: cpp_args,
  link_args: link_args,
  override_options: exe_defaults,
  dependencies: dependencies)

executable('fragviewer',
  sources + [ 'tools/fragviewer.cpp' ],
  cpp_args: cpp_args,
  link_args: link_args,
  override_options: exe_defaults,
  dependencies: dependencies)