find_package(Qt6 REQUIRED COMPONENTS Core Network Qml Widgets)
if(NOT CUSTOM_SQLITE3)
    find_package(SQLite3)

    if(NOT TARGET Letos::SQLite3)
        add_library(Letos::SQLite3 INTERFACE IMPORTED)

        if(TARGET SQLite3::SQLite3)
            target_link_libraries(Letos::SQLite3 INTERFACE SQLite3::SQLite3)
        elseif(TARGET SQLite::SQLite3)
            target_link_libraries(Letos::SQLite3 INTERFACE SQLite::SQLite3)
        else()
            message(FATAL_ERROR "SQLite3 found, but no known SQLite CMake target exists")
        endif()
    endif()
endif()

set(PROJECT_HEADERS
    chillout/chillout.h
    chillout/common/common.h
    chillout/defines.h
    chillout/posix/posixcrashhandler.h
    chillout/windows/StackWalker.h
    chillout/windows/windowscrashhandler.h
    committable.h
    common/bihash.h
    common/bistrhash.h
    common/blockingsocket.h
    common/collections.h
    common/column.h
    common/expiringcache.h
    common/global.h
    common/lazytrigger.h
    common/memoryusage.h
    common/nulldevice.h
    common/objectpool.h
    common/private/blockingsocketprivate.h
    common/readwritelocker.h
    common/signalwait.h
    common/sortedhash.h
    common/sortedset.h
    common/strhash.h
    common/table.h
    common/threadwitheventloop.h
    common/utils.h
    common/utils_sql.h
    common/valuelocker.h
    common/xmldeserializer.h
    completioncomparer.h
    completionhelper.h
    config_builder.h
    config_builder/cfgcategory.h
    config_builder/cfgentry.h
    config_builder/cfglazyinitializer.h
    config_builder/cfgmain.h
    core_global.h
    csvformat.h
    csvserializer.h
    datatype.h
    db/abstractdb.h
    db/abstractdb3.h
    db/asyncqueryrunner.h
    db/attachguard.h
    db/chainexecutor.h
    db/db.h
    db/dbpluginoption.h
    db/dbsqlite3.h
    db/invaliddb.h
    db/queryexecutor.h
    db/queryexecutorsteps/queryexecutoraddrowids.h
    db/queryexecutorsteps/queryexecutorattaches.h
    db/queryexecutorsteps/queryexecutorcolumns.h
    db/queryexecutorsteps/queryexecutorcolumntype.h
    db/queryexecutorsteps/queryexecutorcountresults.h
    db/queryexecutorsteps/queryexecutordatasources.h
    db/queryexecutorsteps/queryexecutordetectschemaalter.h
    db/queryexecutorsteps/queryexecutorexecute.h
    db/queryexecutorsteps/queryexecutorexplainmode.h
    db/queryexecutorsteps/queryexecutorfilter.h
    db/queryexecutorsteps/queryexecutorlimit.h
    db/queryexecutorsteps/queryexecutororder.h
    db/queryexecutorsteps/queryexecutorparsequery.h
    db/queryexecutorsteps/queryexecutorreplaceviews.h
    db/queryexecutorsteps/queryexecutorsmarthints.h
    db/queryexecutorsteps/queryexecutorstep.h
    db/queryexecutorsteps/queryexecutorvaluesmode.h
    db/queryexecutorsteps/queryexecutorwrapdistinctresults.h
    db/sqlerrorcodes.h
    db/sqlerrorresults.h
    db/sqlquery.h
    db/sqlresultsrow.h
    db/stdsqlite3driver.h
    dbattacher.h
    dbobjectorganizer.h
    dbobjecttype.h
    ddlhistorymodel.h
    diff/diff_match_patch.h
    expectedtoken.h
    exportworker.h
    impl/dbattacherimpl.h
    importworker.h
    interruptable.h
    log.h
    parser/ast/sqlitealtertable.h
    parser/ast/sqliteanalyze.h
    parser/ast/sqliteattach.h
    parser/ast/sqlitebegintrans.h
    parser/ast/sqlitecolumntype.h
    parser/ast/sqlitecommittrans.h
    parser/ast/sqliteconflictalgo.h
    parser/ast/sqlitecreateindex.h
    parser/ast/sqlitecreatetable.h
    parser/ast/sqlitecreatetrigger.h
    parser/ast/sqlitecreateview.h
    parser/ast/sqlitecreatevirtualtable.h
    parser/ast/sqliteddlwithdbcontext.h
    parser/ast/sqlitedeferrable.h
    parser/ast/sqlitedelete.h
    parser/ast/sqlitedetach.h
    parser/ast/sqlitedropindex.h
    parser/ast/sqlitedroptable.h
    parser/ast/sqlitedroptrigger.h
    parser/ast/sqlitedropview.h
    parser/ast/sqliteemptyquery.h
    parser/ast/sqliteexpr.h
    parser/ast/sqliteextendedindexedcolumn.h
    parser/ast/sqlitefilterover.h
    parser/ast/sqliteforeignkey.h
    parser/ast/sqliteindexedcolumn.h
    parser/ast/sqliteinsert.h
    parser/ast/sqlitelimit.h
    parser/ast/sqlitenulls.h
    parser/ast/sqliteorderby.h
    parser/ast/sqlitepragma.h
    parser/ast/sqlitequery.h
    parser/ast/sqlitequerytype.h
    parser/ast/sqlitequerywithaliasedtable.h
    parser/ast/sqliteraise.h
    parser/ast/sqlitereindex.h
    parser/ast/sqliterelease.h
    parser/ast/sqliterollback.h
    parser/ast/sqlitesavepoint.h
    parser/ast/sqliteselect.h
    parser/ast/sqlitesortorder.h
    parser/ast/sqlitestatement.h
    parser/ast/sqlitetablerelatedddl.h
    parser/ast/sqliteupdate.h
    parser/ast/sqliteupsert.h
    parser/ast/sqlitevacuum.h
    parser/ast/sqlitewindowdefinition.h
    parser/ast/sqlitewith.h
    parser/keywords.h
    parser/lexer.h
    parser/lexer_low_lev.h
    parser/parser.h
    parser/parser_helper_stubs.h
    parser/parsercontext.h
    parser/parsererror.h
    parser/sqlite3_parse.h
    parser/statementtokenbuilder.h
    parser/token.h
    plugins/builtinplugin.h
    plugins/codeformatterplugin.h
    plugins/confignotifiableplugin.h
    plugins/dbplugin.h
    plugins/dbpluginsqlite3.h
    plugins/dbpluginstdfilebase.h
    plugins/exportplugin.h
    plugins/generalpurposeplugin.h
    plugins/genericexportplugin.h
    plugins/genericplugin.h
    plugins/importplugin.h
    plugins/plugin.h
    plugins/pluginsymbolresolver.h
    plugins/plugintype.h
    plugins/populateconstant.h
    plugins/populatedictionary.h
    plugins/populateplugin.h
    plugins/populaterandom.h
    plugins/populaterandomtext.h
    plugins/populatescript.h
    plugins/populatesequence.h
    plugins/scriptingplugin.h
    plugins/scriptingqt.h
    plugins/scriptingqtdbproxy.h
    plugins/scriptingsql.h
    plugins/sqlformatterplugin.h
    plugins/uiconfiguredplugin.h
    pluginservicebase.h
    populateworker.h
    qio.h
    querygenerator.h
    querymodel.h
    returncode.h
    rsa/BigInt.h
    rsa/Key.h
    rsa/KeyPair.h
    rsa/PrimeGenerator.h
    rsa/RSA.h
    schemaresolver.h
    selectresolver.h
    services/codeformatter.h
    services/codesnippetmanager.h
    services/collationmanager.h
    services/config.h
    services/dbmanager.h
    services/exportmanager.h
    services/extralicensemanager.h
    services/functionmanager.h
    services/impl/collationmanagerimpl.h
    services/impl/configimpl.h
    services/impl/dbmanagerimpl.h
    services/impl/functionmanagerimpl.h
    services/impl/pluginmanagerimpl.h
    services/impl/sqliteextensionmanagerimpl.h
    services/importmanager.h
    services/notifymanager.h
    services/pluginmanager.h
    services/populatemanager.h
    services/sqliteextensionmanager.h
    services/updatemanager.h
    sqlfileexecutor.h
    sqlhistorymodel.h
    letos.h
    tablemodifier.h
    translations.h
    tsvserializer.h
    viewmodifier.h
)

set(PROJECT_SOURCES
    chillout/chillout.cpp
    chillout/common/common.cpp
    chillout/posix/posixcrashhandler.cpp
    chillout/windows/StackWalker.cpp
    chillout/windows/windowscrashhandler.cpp
    committable.cpp
    common/bistrhash.cpp
    common/blockingsocket.cpp
    common/collections.cpp
    common/column.cpp
    common/lazytrigger.cpp
    common/memoryusage.cpp
    common/nulldevice.cpp
    common/private/blockingsocketprivate.cpp
    common/readwritelocker.cpp
    common/signalwait.cpp
    common/table.cpp
    common/threadwitheventloop.cpp
    common/utils.cpp
    common/utils_sql.cpp
    common/xmldeserializer.cpp
    completioncomparer.cpp
    completionhelper.cpp
    config_builder/cfgcategory.cpp
    config_builder/cfgentry.cpp
    config_builder/cfglazyinitializer.cpp
    config_builder/cfgmain.cpp
    csvformat.cpp
    csvserializer.cpp
    datatype.cpp
    db/abstractdb.cpp
    db/asyncqueryrunner.cpp
    db/attachguard.cpp
    db/chainexecutor.cpp
    db/db.cpp
    db/dbsqlite3.cpp
    db/invaliddb.cpp
    db/queryexecutor.cpp
    db/queryexecutorsteps/queryexecutoraddrowids.cpp
    db/queryexecutorsteps/queryexecutorattaches.cpp
    db/queryexecutorsteps/queryexecutorcolumns.cpp
    db/queryexecutorsteps/queryexecutorcolumntype.cpp
    db/queryexecutorsteps/queryexecutorcountresults.cpp
    db/queryexecutorsteps/queryexecutordatasources.cpp
    db/queryexecutorsteps/queryexecutordetectschemaalter.cpp
    db/queryexecutorsteps/queryexecutorexecute.cpp
    db/queryexecutorsteps/queryexecutorexplainmode.cpp
    db/queryexecutorsteps/queryexecutorfilter.cpp
    db/queryexecutorsteps/queryexecutorlimit.cpp
    db/queryexecutorsteps/queryexecutororder.cpp
    db/queryexecutorsteps/queryexecutorparsequery.cpp
    db/queryexecutorsteps/queryexecutorreplaceviews.cpp
    db/queryexecutorsteps/queryexecutorsmarthints.cpp
    db/queryexecutorsteps/queryexecutorstep.cpp
    db/queryexecutorsteps/queryexecutorvaluesmode.cpp
    db/queryexecutorsteps/queryexecutorwrapdistinctresults.cpp
    db/sqlerrorcodes.cpp
    db/sqlerrorresults.cpp
    db/sqlquery.cpp
    db/sqlresultsrow.cpp
    dbattacher.cpp
    dbobjectorganizer.cpp
    ddlhistorymodel.cpp
    diff/diff_match_patch.cpp
    expectedtoken.cpp
    exportworker.cpp
    impl/dbattacherimpl.cpp
    importworker.cpp
    log.cpp
    parser/ast/sqlitealtertable.cpp
    parser/ast/sqliteanalyze.cpp
    parser/ast/sqliteattach.cpp
    parser/ast/sqlitebegintrans.cpp
    parser/ast/sqlitecolumntype.cpp
    parser/ast/sqlitecommittrans.cpp
    parser/ast/sqliteconflictalgo.cpp
    parser/ast/sqlitecreateindex.cpp
    parser/ast/sqlitecreatetable.cpp
    parser/ast/sqlitecreatetrigger.cpp
    parser/ast/sqlitecreateview.cpp
    parser/ast/sqlitecreatevirtualtable.cpp
    parser/ast/sqlitedeferrable.cpp
    parser/ast/sqlitedelete.cpp
    parser/ast/sqlitedetach.cpp
    parser/ast/sqlitedropindex.cpp
    parser/ast/sqlitedroptable.cpp
    parser/ast/sqlitedroptrigger.cpp
    parser/ast/sqlitedropview.cpp
    parser/ast/sqliteemptyquery.cpp
    parser/ast/sqliteexpr.cpp
    parser/ast/sqlitefilterover.cpp
    parser/ast/sqliteforeignkey.cpp
    parser/ast/sqliteindexedcolumn.cpp
    parser/ast/sqliteinsert.cpp
    parser/ast/sqlitelimit.cpp
    parser/ast/sqlitenulls.cpp
    parser/ast/sqliteorderby.cpp
    parser/ast/sqlitepragma.cpp
    parser/ast/sqlitequery.cpp
    parser/ast/sqlitequerytype.cpp
    parser/ast/sqliteraise.cpp
    parser/ast/sqlitereindex.cpp
    parser/ast/sqliterelease.cpp
    parser/ast/sqliterollback.cpp
    parser/ast/sqlitesavepoint.cpp
    parser/ast/sqliteselect.cpp
    parser/ast/sqlitesortorder.cpp
    parser/ast/sqlitestatement.cpp
    parser/ast/sqliteupdate.cpp
    parser/ast/sqliteupsert.cpp
    parser/ast/sqlitevacuum.cpp
    parser/ast/sqlitewindowdefinition.cpp
    parser/ast/sqlitewith.cpp
    parser/keywords.cpp
    parser/lexer.cpp
    parser/lexer_low_lev.cpp
    parser/parser.cpp
    parser/parser_helper_stubs.cpp
    parser/parsercontext.cpp
    parser/parsererror.cpp
    parser/sqlite3_parse.cpp
    parser/statementtokenbuilder.cpp
    parser/token.cpp
    plugins/builtinplugin.cpp
    plugins/dbpluginsqlite3.cpp
    plugins/dbpluginstdfilebase.cpp
    plugins/genericexportplugin.cpp
    plugins/genericplugin.cpp
    plugins/pluginsymbolresolver.cpp
    plugins/plugintype.cpp
    plugins/populateconstant.cpp
    plugins/populatedictionary.cpp
    plugins/populaterandom.cpp
    plugins/populaterandomtext.cpp
    plugins/populatescript.cpp
    plugins/populatesequence.cpp
    plugins/scriptingqt.cpp
    plugins/scriptingqtdbproxy.cpp
    plugins/scriptingsql.cpp
    plugins/sqlformatterplugin.cpp
    pluginservicebase.cpp
    populateworker.cpp
    qio.cpp
    querygenerator.cpp
    querymodel.cpp
    returncode.cpp
    rsa/BigInt.cpp
    rsa/Key.cpp
    rsa/KeyPair.cpp
    rsa/PrimeGenerator.cpp
    rsa/RSA.cpp
    schemaresolver.cpp
    selectresolver.cpp
    services/codeformatter.cpp
    services/codesnippetmanager.cpp
    services/config.cpp
    services/dbmanager.cpp
    services/exportmanager.cpp
    services/extralicensemanager.cpp
    services/functionmanager.cpp
    services/impl/collationmanagerimpl.cpp
    services/impl/configimpl.cpp
    services/impl/dbmanagerimpl.cpp
    services/impl/functionmanagerimpl.cpp
    services/impl/pluginmanagerimpl.cpp
    services/impl/sqliteextensionmanagerimpl.cpp
    services/importmanager.cpp
    services/notifymanager.cpp
    services/populatemanager.cpp
    services/updatemanager.cpp
    sqlfileexecutor.cpp
    sqlhistorymodel.cpp
    letos.cpp
    tablemodifier.cpp
    translations.cpp
    tsvserializer.cpp
    viewmodifier.cpp
)
qt_add_resources(PROJECT_SOURCES
    core.qrc
)
qt_wrap_ui(PROJECT_SOURCES
    plugins/populateconstant.ui
    plugins/populatedictionary.ui
    plugins/populaterandom.ui
    plugins/populaterandomtext.ui
    plugins/populatescript.ui
    plugins/populatesequence.ui
)

target_sources(MiscFiles PRIVATE
        parser/sqlite3_parse.y
)

add_library(coreLetos SHARED ${PROJECT_HEADERS} ${PROJECT_SOURCES}
    common/bigdec.h common/bigdec.cpp)
letos_set_output_properties(coreLetos)
set_target_properties(coreLetos PROPERTIES
    VERSION 1.0.0
    SOVERSION 1
)
target_compile_definitions(coreLetos PRIVATE
    CORE_LIBRARY
)
target_link_libraries(coreLetos PUBLIC
    Letos::SQLite3
)
target_link_libraries(coreLetos PRIVATE
    Qt::Core
    Qt::Network
    Qt::Qml
)

if(WIN32)
    target_link_libraries(coreLetos PRIVATE
        imagehlp
        psapi
        version
    )

    if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
        target_compile_definitions(coreLetos PRIVATE
            _LIBCPP_ENABLE_CXX17_REMOVED_UNEXPECTED_FUNCTIONS
        )
    endif()
endif()

if(SYS_PLUGINS_DIR)
    target_compile_definitions(coreLetos PRIVATE
        SYS_PLUGINS_DIR="${SYS_PLUGINS_DIR}"
    )
endif()

install(
    TARGETS coreLetos
    LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
)
