cmake_minimum_required(VERSION 3.16)
project(sonoscontroller LANGUAGES C CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)

find_package(Qt5 REQUIRED COMPONENTS Core Gui Network Qml Quick Concurrent Xml)
find_package(Threads REQUIRED)

if(NOT DEFINED ENV{ARCH_TRIPLET})
   message(FATAL_ERROR "ARCH_TRIPLET is not set. Build this project with Clickable.")
endif()

set(ARCH "$ENV{ARCH}")
set(ARCH_TRIPLET "$ENV{ARCH_TRIPLET}")
set(CLICK_FRAMEWORK "$ENV{CLICK_FRAMEWORK}")
set(APPARMOR_POLICY "$ENV{APPARMOR_POLICY}")

if(ARCH STREQUAL "arm64")
   set(GO_ARCH "arm64")
elseif(ARCH STREQUAL "amd64")
   set(GO_ARCH "amd64")
elseif(ARCH STREQUAL "armhf")
   set(GO_ARCH "arm")
else()
   message(FATAL_ERROR "Unsupported Go target architecture: ${ARCH}")
endif()

find_program(GO_EXECUTABLE go)
if(NOT GO_EXECUTABLE)
   message(FATAL_ERROR "Go is required to build the SMB2/SMB3 bridge.")
endif()

configure_file(
   ${CMAKE_CURRENT_SOURCE_DIR}/manifest.json.in
   ${CMAKE_CURRENT_BINARY_DIR}/manifest.json
   @ONLY
)

configure_file(
   ${CMAKE_CURRENT_SOURCE_DIR}/sonoscontroller.apparmor.in
   ${CMAKE_CURRENT_BINARY_DIR}/sonoscontroller.apparmor
   @ONLY
)

set(SMB_BRIDGE_ARCHIVE "${CMAKE_CURRENT_BINARY_DIR}/libsmbbridge.a")
set(SMB_BRIDGE_HEADER "${CMAKE_CURRENT_BINARY_DIR}/libsmbbridge.h")

set(SMB_GO_ENV
   "CGO_ENABLED=1"
   "GOOS=linux"
   "GOARCH=${GO_ARCH}"
   "CC=${CMAKE_C_COMPILER}"
   "CXX=${CMAKE_CXX_COMPILER}"
   "GOCACHE=${CMAKE_CURRENT_BINARY_DIR}/go-cache"
   "GOMODCACHE=${CMAKE_CURRENT_BINARY_DIR}/go-mod-cache"
   "GOFLAGS=-mod=mod"
)
if(ARCH STREQUAL "armhf")
   list(APPEND SMB_GO_ENV "GOARM=7")
endif()

add_custom_command(
   OUTPUT
      ${SMB_BRIDGE_ARCHIVE}
      ${SMB_BRIDGE_HEADER}
   COMMAND
      ${CMAKE_COMMAND} -E env ${SMB_GO_ENV}
      ${GO_EXECUTABLE} build -trimpath -buildmode=c-archive -o ${SMB_BRIDGE_ARCHIVE} .
   WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/smbbridge
   DEPENDS
      ${CMAKE_CURRENT_SOURCE_DIR}/smbbridge/main.go
      ${CMAKE_CURRENT_SOURCE_DIR}/smbbridge/go.mod
      ${CMAKE_CURRENT_SOURCE_DIR}/smbbridge/go.sum
   COMMENT "Building SMB2/SMB3 client bridge"
   VERBATIM
)

add_custom_target(smbbridge ALL DEPENDS ${SMB_BRIDGE_ARCHIVE} ${SMB_BRIDGE_HEADER})

qt5_add_resources(APP_RESOURCES resources.qrc)

add_executable(
   sonoscontroller
   src/main.cpp
   src/SonosBackend.cpp
   src/SmbSupport.cpp
   src/LogControl.cpp
   src/SonosBackend.h
   src/LogControl.h
   ${APP_RESOURCES}
)

add_dependencies(sonoscontroller smbbridge)

target_include_directories(
   sonoscontroller
   PRIVATE
   ${CMAKE_CURRENT_SOURCE_DIR}/src
   ${CMAKE_CURRENT_BINARY_DIR}
)

target_link_libraries(
   sonoscontroller
   PRIVATE
   Qt5::Core
   Qt5::Gui
   Qt5::Network
   Qt5::Qml
   Qt5::Quick
   Qt5::Concurrent
   Qt5::Xml
   ${SMB_BRIDGE_ARCHIVE}
   Threads::Threads
   ${CMAKE_DL_LIBS}
   m
)

install(
   TARGETS sonoscontroller
   RUNTIME DESTINATION lib/${ARCH_TRIPLET}/bin
)

install(
   FILES
   ${CMAKE_CURRENT_BINARY_DIR}/manifest.json
   ${CMAKE_CURRENT_BINARY_DIR}/sonoscontroller.apparmor
   ${CMAKE_CURRENT_SOURCE_DIR}/sonoscontroller.desktop
   DESTINATION .
)

install(
   DIRECTORY assets
   DESTINATION .
)

install(
   FILES
   ${CMAKE_CURRENT_SOURCE_DIR}/LICENSE
   ${CMAKE_CURRENT_SOURCE_DIR}/THIRD_PARTY_LICENSES.md
   ${CMAKE_CURRENT_SOURCE_DIR}/README.md
   ${CMAKE_CURRENT_SOURCE_DIR}/CHANGELOG.md
   DESTINATION share/sonoscontroller
)
