cmake_minimum_required(VERSION 3.13 FATAL_ERROR)

project(rpi-beamertool
  VERSION 0.6.0)

# Set a default build type if none was specified
if (NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
  message(STATUS "Setting build type to 'RelWithDebInfo' as none was specified.")
  set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "Choose the type of build." FORCE)
  set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo")
endif ()

# Dependencies
find_package(Threads REQUIRED)
find_package(Curses REQUIRED)
find_package(PkgConfig REQUIRED)

# EGL "surfaceless" Offscreen-Kontext (Ersatz fuer SDL2/kmsdrm - siehe
# renderer.h fuer den Hintergrund: das direkte SDL2/kmsdrm-Rendering war auf
# manchen Pi4/Debian-13-Kombinationen unzuverlaessig)
pkg_check_modules(EGL REQUIRED egl)

# OpenGL ES 2.0
pkg_check_modules(GLESV2 REQUIRED glesv2)

# Source files
set(source_files
  src/rpi_beamertool.cpp
  src/artnet_receiver.cpp
  src/config_loader.cpp
  src/console_screen.cpp
  src/canvas/canvas_manager.cpp
  src/canvas/canvas.cpp
  src/canvas/renderer.cpp
  src/canvas/fps_counter.cpp
  src/canvas/gl_state.cpp
  src/canvas/media_player.cpp
  src/canvas/background_manager.cpp
  src/canvas/mpv_display.cpp
  src/canvas/video_recorder.cpp
  src/canvas/canvas_content/content_manager.cpp
  src/canvas/canvas_content/content_interface.cpp
  src/canvas/canvas_content/content_example_plugin/content_example_plugin.cpp
  src/canvas/canvas_content/content_local_file_texture/content_local_file_texture.cpp
  src/canvas/canvas_content/content_local_file_texture/texture.cpp
  src/canvas/canvas_content/content_local_file_texture/stb_image.c
  src/canvas/canvas_content/content_local_file_texture/GIFLoader.cpp)

# Header files
set(header_files
  src/artnet_receiver.h
  src/config_loader.h
  src/console_screen.h
  src/version.h
  src/canvas/canvas_classes.h
  src/canvas/canvas_manager.h
  src/canvas/canvas.h
  src/canvas/renderer.h
  src/canvas/fps_counter.h
  src/canvas/mat4.h
  src/canvas/gl_state.h
  src/canvas/media_player.h
  src/canvas/background_manager.h
  src/canvas/mpv_display.h
  src/canvas/video_recorder.h
  src/canvas/canvas_content/content_manager.h
  src/canvas/canvas_content/content_interface.h
  src/canvas/canvas_content/content_example_plugin/content_example_plugin.h
  src/canvas/canvas_content/content_local_file_texture/content_local_file_texture.h
  src/canvas/canvas_content/content_local_file_texture/texture.h
  src/canvas/canvas_content/content_local_file_texture/stb_image.h
  src/canvas/canvas_content/content_local_file_texture/GIFLoader.h)

# Project
add_executable(${PROJECT_NAME}
  ${source_files} ${header_files})

# C++ standard
target_compile_features(${PROJECT_NAME} PUBLIC cxx_std_17)
set_target_properties(${PROJECT_NAME} PROPERTIES CXX_EXTENSIONS OFF)

# Including and linking
target_include_directories(${PROJECT_NAME} PRIVATE
  ${EGL_INCLUDE_DIRS}
  ${GLESV2_INCLUDE_DIRS}
  ${CURSES_INCLUDE_DIR})
target_link_directories(${PROJECT_NAME} PRIVATE
  ${EGL_LIBRARY_DIRS}
  ${GLESV2_LIBRARY_DIRS})
target_link_libraries(${PROJECT_NAME} PRIVATE
  Threads::Threads
  ${EGL_LIBRARIES}
  ${GLESV2_LIBRARIES}
  ${CURSES_LIBRARIES})
target_compile_options(${PROJECT_NAME} PRIVATE
  ${EGL_CFLAGS_OTHER}
  ${GLESV2_CFLAGS_OTHER})

# Versionsnummer: siehe version.sh im Projekt-Wurzelverzeichnis. Das Skript
# generiert src/version.h (RPI_BEAMERTOOL_VERSION) - das ist jetzt die
# EINZIGE Quelle der Versionsnummer, nicht mehr diese CMakeLists.txt.
# Falls src/version.h fehlt (./version.sh noch nie gelaufen), legt CMake
# hier einen minimalen Fallback an, damit der Build trotzdem funktioniert.
if (NOT EXISTS "${CMAKE_SOURCE_DIR}/src/version.h")
  file(WRITE "${CMAKE_SOURCE_DIR}/src/version.h"
"// Fallback, siehe version.sh im Projekt-Wurzelverzeichnis
#pragma once
#define RPI_BEAMERTOOL_VERSION \"v${PROJECT_VERSION}\"
#define RPI_BEAMERTOOL_BUILD_DATE \"unbekannt (./version.sh stamp ausfuehren)\"
")
endif ()

# stb_image.c ist eine alte, monolithische Version (1.33) ohne
# STBI_ONLY_PNG-Unterstuetzung (siehe TODO) und braucht mit hoher
# Optimierungsstufe spuerbar lange zum Kompilieren. Da PNGs nur einmal beim
# Programmstart geladen werden (kein Hot-Path), kostet eine niedrigere
# Optimierung hier zur Laufzeit praktisch nichts, spart aber Build-Zeit.
set_source_files_properties(
  src/canvas/canvas_content/content_local_file_texture/stb_image.c
  PROPERTIES COMPILE_OPTIONS "-O1")

# Enable strict warnings
option(RPI_BEAMERTOOL_STRICT_WARNINGS "Enable strict compiler warnings." OFF)
if (RPI_BEAMERTOOL_STRICT_WARNINGS)
  target_compile_options(${PROJECT_NAME} PRIVATE -Werror -Wall -Wextra -pedantic -pedantic-errors)
endif ()
