cmake_minimum_required(VERSION 4.0)

project(smartvos VERSION 1.0 LANGUAGES CXX)

# Set C++ standard
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# Enable all warnings
add_compile_options(-Wall)

# Find Qt packages
find_package(Qt6 COMPONENTS Core Gui Widgets Network Multimedia SerialPort Mqtt WebSockets REQUIRED)

# Find dependencies using pkg-config
find_package(PkgConfig REQUIRED)
pkg_check_modules(PIPEWIRE REQUIRED libpipewire-0.3)
pkg_check_modules(LIBNL3 REQUIRED libnl-3.0 libnl-genl-3.0)

# Enable automatic moc and uic processing
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)

# Add src to include path for relative includes
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/src)

# Enable testing framework
enable_testing()

# Define shared sources for static library (core sources used by both main and tests)
set(SHINTERFACE_CORE_SOURCES
    src/sensors/mqttsensorsource.h
    src/sensors/mqttsensorsource.cpp
    src/items/mqttitem.h
    src/items/mqttitem.cpp
    src/mqttclient.h
    src/mqttclient.cpp
    src/microcontroller.h
    src/microcontroller.cpp
    src/sun.h
    src/sun.cpp
    src/programmode.h
    src/programmode.cpp

    src/service/service.h
    src/service/service.cpp
    src/service/tcpclient.h
    src/service/tcpclient.cpp
    src/service/server.h
    src/service/server.cpp
    src/service/tcpserver.h
    src/service/tcpserver.cpp
    src/service/websocketserver.h
    src/service/websocketserver.cpp

    src/actors/actor.h
    src/actors/actor.cpp
    src/actors/factoractor.h
    src/actors/factoractor.cpp
    src/actors/polynomalactor.h
    src/actors/polynomalactor.cpp
    src/actors/sensoractor.h
    src/actors/sensoractor.cpp
    src/actors/alarmtime.h
    src/actors/alarmtime.cpp
    src/actors/regulator.h
    src/actors/regulator.cpp
    src/actors/timeractor.h
    src/actors/timeractor.cpp

    src/sensors/sensor.h
    src/sensors/sensor.cpp
    src/sensors/sunsensor.h
    src/sensors/sunsensor.cpp

    src/items/item.h
    src/items/item.cpp
    src/items/relay.h
    src/items/relay.cpp
    src/items/poweritem.h
    src/items/poweritem.cpp
    src/items/messageitem.h
    src/items/messageitem.cpp
    src/items/systemitem.h
    src/items/systemitem.cpp
    src/items/auxitem.h
    src/items/auxitem.cpp
    src/items/rgbitem.h
    src/items/rgbitem.cpp
    src/items/itemsource.h
    src/items/itemsource.cpp
    src/items/itemloadersource.h
    src/items/itemloadersource.cpp
    src/items/fixeditemsource.h
    src/items/fixeditemsource.cpp
    src/items/itemstore.h
    src/items/itemstore.cpp
)

# Create static library
add_library(smartvos_core STATIC ${SHINTERFACE_CORE_SOURCES})

# Link Qt and system libraries to static library
target_link_libraries(smartvos_core
    Qt6::Core
    Qt6::Gui
    Qt6::Widgets
    Qt6::Network
    Qt6::Multimedia
    Qt6::SerialPort
    Qt6::Mqtt
    Qt6::WebSockets
    ${PIPEWIRE_LIBRARIES}
    ${LIBNL3_LIBRARIES}
)

# Add include paths to static library
target_include_directories(smartvos_core PUBLIC
    ${CMAKE_CURRENT_SOURCE_DIR}/src
    ${PIPEWIRE_INCLUDE_DIRS}
    ${LIBNL3_INCLUDE_DIRS}
)

# Add subdirectory for tests
add_subdirectory(tests)

# Create executable
add_executable(smartvos
        src/main.cpp
        src/mainobject.h
        src/mainobject.cpp
        src/apgetconnected.h
        src/apgetconnected.cpp
        src/pipewire.h
        src/pipewire.cpp

        src/ui/mainwindow.h
        src/ui/mainwindow.cpp
        src/ui/itemwidget.h
        src/ui/itemwidget.cpp
        src/ui/itemscrollbox.h
        src/ui/itemscrollbox.cpp
        src/ui/sensorlistwidget.h
        src/ui/sensorlistwidget.cpp
        src/ui/itemcreationdialog.h
        src/ui/itemcreationdialog.cpp
        src/ui/itemsettingsdialog.h
        src/ui/itemsettingsdialog.cpp
        src/ui/actorsettingsdialog.h
        src/ui/actorsettingsdialog.cpp
        src/ui/sensorsettingsdialog.h
        src/ui/sensorsettingsdialog.cpp

        src/ui/actorwidgets/factoractorwidget.h
        src/ui/actorwidgets/factoractorwidget.cpp
        src/ui/actorwidgets/polynomalactorwidget.h
        src/ui/actorwidgets/polynomalactorwidget.cpp
        src/ui/actorwidgets/sensoractorwidget.h
        src/ui/actorwidgets/sensoractorwidget.cpp
        src/ui/actorwidgets/timeractorwidget.h
        src/ui/actorwidgets/timeractorwidget.cpp
        src/ui/actorwidgets/alarmwidget.h
        src/ui/actorwidgets/alarmwidget.cpp
        src/ui/actorwidgets/regulatorwdiget.h
        src/ui/actorwidgets/regulatorwdiget.cpp

        src/ui/itemsettingswidgets/messageitemsettingswidget.h
        src/ui/itemsettingswidgets/messageitemsettingswidget.cpp
        src/ui/itemsettingswidgets/relayitemsettingswidget.h
        src/ui/itemsettingswidgets/relayitemsettingswidget.cpp
        src/ui/itemsettingswidgets/systemitemsettingswidget.h
        src/ui/itemsettingswidgets/systemitemsettingswidget.cpp
        src/ui/itemsettingswidgets/mqttitemsettingswidget.h
        src/ui/itemsettingswidgets/mqttitemsettingswidget.cpp
)

# Add UI files
target_sources(smartvos
    PRIVATE
        src/ui/mainwindow.ui
        src/ui/itemwidget.ui
        src/ui/relayscrollbox.ui
        src/ui/itemcreationdialog.ui
        src/ui/itemsettingsdialog.ui
        src/ui/actorsettingsdialog.ui
        src/ui/sensorsettingsdialog.ui
        src/ui/actorwidgets/factoractorwidget.ui
        src/ui/actorwidgets/polynomalactorwidget.ui
        src/ui/actorwidgets/sensoractorwidget.ui
        src/ui/actorwidgets/timeractorwidget.ui
        src/ui/actorwidgets/alarmwidget.ui
        src/ui/actorwidgets/regulatorwdiget.ui
        src/ui/itemsettingswidgets/messageitemsettingswidget.ui
        src/ui/itemsettingswidgets/relayitemsettingswidget.ui
        src/ui/itemsettingswidgets/systemitemsettingswidget.ui
        src/ui/itemsettingswidgets/mqttitemsettingswidget.ui
)

# Add resource file
target_sources(smartvos
    PRIVATE
        resources.qrc
)

# Link libraries - link to static library plus UI-specific dependencies
target_link_libraries(smartvos
    smartvos_core
    Qt6::Core
    Qt6::Gui
    Qt6::Widgets
    Qt6::Network
    Qt6::Multimedia
    Qt6::SerialPort
    Qt6::Mqtt
    Qt6::WebSockets
    ${PIPEWIRE_LIBRARIES}
    ${LIBNL3_LIBRARIES}
)

# Add include paths
include_directories(${PIPEWIRE_INCLUDE_DIRS} ${LIBNL3_INCLUDE_DIRS})

# Installation
install(TARGETS smartvos DESTINATION bin)
install(TARGETS smartvos_core DESTINATION lib)

# Install icon
install(FILES xyz.uvos.icon.png DESTINATION share/icons/hicolor/128x128/apps)

# Install .desktop file
install(FILES xyz.uvos.smartvos.desktop DESTINATION share/applications)

# Update icon cache (optional, for icon themes)
install(CODE "execute_process(COMMAND gtk-update-icon-cache -f -t ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor WORKING_DIRECTORY ${CMAKE_INSTALL_PREFIX})")
