cmake_minimum_required(VERSION 3.16)
project(mqt00 VERSION 0.1 LANGUAGES CXX)

set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# Opcions específiques per WebAssembly - ABANS de find_package
if(EMSCRIPTEN)
    message(STATUS "Compilant per WebAssembly")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s ALLOW_MEMORY_GROWTH=1")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s ASYNCIFY=1")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s WEBSOCKET_URL=wss://")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s ERROR_ON_UNDEFINED_SYMBOLS=0")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s EXPORT_ALL=1")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s FORCE_FILESYSTEM=1")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s WASM=1")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s STACK_SIZE=5MB")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s DISABLE_EXCEPTION_CATCHING=0")
endif()

find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core Quick Network Mqtt WebSockets)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core Quick Network Mqtt WebSockets)

# ============================================================
# CONFIGURACIÓ OPENSSL PER ANDROID - DESPRÉS de find_package
# ============================================================
if(ANDROID)
    message(STATUS "================================================")
    message(STATUS "  Configurant OpenSSL per Android")
    message(STATUS "================================================")
    message(STATUS "  Qt Version: ${QT_VERSION}")
    message(STATUS "  Qt Major: ${QT_VERSION_MAJOR}, Minor: ${QT_VERSION_MINOR}")
    message(STATUS "  Arquitectura: ${ANDROID_ABI}")
    
    # Ruta multiplataforma (funciona a Linux, macOS i Windows)
    set(ANDROID_OPENSSL_ROOT "$ENV{HOME}/Android/android_openssl")
    
    # Per Qt 6.5+ usar OpenSSL 3.x
    set(OPENSSL_ROOT "${ANDROID_OPENSSL_ROOT}/ssl_3/${ANDROID_ABI}")
    set(LIB_SSL "libssl_3.so")
    set(LIB_CRYPTO "libcrypto_3.so")
    
    message(STATUS "  Buscant OpenSSL 3.x a: ${OPENSSL_ROOT}")
    
    # Verificar que existeixen les llibreries
    if(EXISTS "${OPENSSL_ROOT}/${LIB_SSL}")
        message(STATUS "  ✓ Trobat: ${OPENSSL_ROOT}/${LIB_SSL}")
    else()
        message(FATAL_ERROR "  ✗ NO trobat: ${OPENSSL_ROOT}/${LIB_SSL}")
    endif()
    
    if(EXISTS "${OPENSSL_ROOT}/${LIB_CRYPTO}")
        message(STATUS "  ✓ Trobat: ${OPENSSL_ROOT}/${LIB_CRYPTO}")
    else()
        message(FATAL_ERROR "  ✗ NO trobat: ${OPENSSL_ROOT}/${LIB_CRYPTO}")
    endif()
    
    # CRÍTICO: Configurar les llibreries extra per Android
    set(ANDROID_EXTRA_LIBS
        "${OPENSSL_ROOT}/${LIB_SSL}"
        "${OPENSSL_ROOT}/${LIB_CRYPTO}"
        CACHE INTERNAL "Extra libs for Android"
    )
    
    # CRÍTICO: Passar a Qt amb FORCE
    set(QT_ANDROID_EXTRA_LIBS 
        "${OPENSSL_ROOT}/${LIB_SSL};${OPENSSL_ROOT}/${LIB_CRYPTO}" 
        CACHE STRING "" FORCE
    )
    
    message(STATUS "  Llibreries configurades:")
    message(STATUS "    - ${OPENSSL_ROOT}/${LIB_SSL}")
    message(STATUS "    - ${OPENSSL_ROOT}/${LIB_CRYPTO}")
    message(STATUS "  ✓ OpenSSL configurat correctament per Android")
    message(STATUS "================================================")
endif()

if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
    qt_add_executable(appmqt00
        MANUAL_FINALIZATION
        main.cpp
    )

    qt_add_qml_module(appmqt00
        URI mqt00
        VERSION 1.0
        QML_FILES main.qml
        SOURCES
            connexio.cpp
            mqttbasic.cpp
            websocketiodevice.cpp
        connexio.h
            mqttbasic.h
            websocketiodevice.h
        RESOURCES qml.qrc
    )
else()
    qt_add_executable(appmqt00
        main.cpp
    )

    qt_add_qml_module(appmqt00
        URI mqt00
        VERSION 1.0
        QML_FILES main.qml
        SOURCES
            connexio.cpp
            mqttbasic.cpp
            websocketiodevice.cpp
        connexio.h
            mqttbasic.h
            websocketiodevice.h
        RESOURCES qml.qrc
    )
endif()

if(${QT_VERSION} VERSION_LESS 6.1.0)
    set(BUNDLE_ID_OPTION MACOSX_BUNDLE_GUI_IDENTIFIER com.example.appmqt00)
endif()

set_target_properties(appmqt00 PROPERTIES
    ${BUNDLE_ID_OPTION}
    MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
    MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
    MACOSX_BUNDLE TRUE
    WIN32_EXECUTABLE TRUE
)

target_link_libraries(appmqt00
    PRIVATE
        Qt${QT_VERSION_MAJOR}::Core Qt${QT_VERSION_MAJOR}::Quick Qt${QT_VERSION_MAJOR}::Network Qt${QT_VERSION_MAJOR}::Mqtt Qt${QT_VERSION_MAJOR}::WebSockets
)

# ============================================================
# AFEGIR LLIBRERIES OPENSSL AL TARGET (DESPRÉS de target_link_libraries)
# ============================================================
if(ANDROID)
    set_property(TARGET appmqt00 
        APPEND PROPERTY QT_ANDROID_EXTRA_LIBS
        "${OPENSSL_ROOT}/${LIB_SSL}"
        "${OPENSSL_ROOT}/${LIB_CRYPTO}"
    )
    
    message(STATUS "================================================")
    message(STATUS "  EXTRA LIBS AFEGIDES AL TARGET appmqt00")
    message(STATUS "================================================")
endif()

include(GNUInstallDirs)
install(TARGETS appmqt00
    BUNDLE DESTINATION .
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)

if(QT_VERSION_MAJOR EQUAL 6)
    qt_finalize_executable(appmqt00)
endif()
