cmake_minimum_required(VERSION 3.7)
set(CMAKE_OSX_DEPLOYMENT_TARGET "12.0" CACHE STRING "Minimum OS X deployment version")
project(dxde)
set(PROJECT_VERSION "1.40.14")

set(DXDE_INCLUDE_DIRS "")
set(DXDE_LIBS "")
set(DXDE_FRAMEWORKS "")

include(CheckCXXCompilerFlag)
CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
if(COMPILER_SUPPORTS_CXX11)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
else()
    message(STATUS "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.")
    return()
endif()

set(DX_WX_CONFIG wx-config CACHE STRING "wx-config executable")
if(UNIX)
    execute_process(COMMAND which ${DX_WX_CONFIG} OUTPUT_VARIABLE WX_TOOL OUTPUT_STRIP_TRAILING_WHITESPACE)
    if(NOT WX_TOOL)
        message(FATAL_ERROR "\nNo functional wx_config script was found in your PATH.\nIs the wxWidgets development package installed?")
    else()
        execute_process(COMMAND sh ${WX_TOOL} --version OUTPUT_VARIABLE WX_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE)
        string(SUBSTRING "${WX_VERSION}" "0" "1" wxMAJOR_VERSION)
        string(SUBSTRING "${WX_VERSION}" "2" "1" wxMINOR_VERSION)
        string(SUBSTRING "${WX_VERSION}" "4" "1" wxRELEASE_NUMBER)
        if(wxMAJOR_VERSION LESS 3)
        message(FATAL_ERROR "\nI'm afraid your wxWidgets version is too old.\nBuilding dxde requires at least wxWidgets-3.0.0")
        endif()
    endif()
    message("-- wx-config used is: ${WX_TOOL}")
    message("-- wxWidgets version is: ${WX_VERSION}")
    if(NOT APPLE AND NOT MINGW)
        # Is the wx we are using built on gtk2 or 3?
        execute_process(COMMAND ${WX_TOOL} --selected_config OUTPUT_VARIABLE WX_GTK_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE)
        string(SUBSTRING "${WX_GTK_VERSION}" "3" "1" GTK_VERSION)
        message("-- gtk version is: ${GTK_VERSION}")
    endif()
    set(wxWidgets_CONFIG_EXECUTABLE ${WX_TOOL})
endif(UNIX)

set(wxWidgets_USE_LIBS)
option(WX_MONOLITHIC "Use wx monolithic build" FALSE)
if(WX_MONOLITHIC)
    find_package(wxWidgets COMPONENTS mono)
else(WX_MONOLITHIC)
    find_package(wxWidgets COMPONENTS core base adv aui html xml net)
endif(WX_MONOLITHIC)
if(wxWidgets_FOUND)
   include("${wxWidgets_USE_FILE}")
else(wxWidgets_FOUND)
   # For convenience. When we cannot continue, inform the user
   message("wxWidgets not found!")
endif(wxWidgets_FOUND)

set(HAVE_CURL FALSE)
#MXE cross-compile
option(CURLSTATIC "Curl is build statically" FALSE)

if(CURLSTATIC)
    find_package(PkgConfig)
    if(PKG_CONFIG_FOUND)
        pkg_check_modules(CURL libcurl)
        list(APPEND DXDE_INCLUDE_DIRS ${CURL_INCLUDE_DIR})
        list(APPEND DXDE_LIBS ${CURL_LIBRARIES})
    endif(PKG_CONFIG_FOUND)
    set(HAVE_CURL TRUE)
    add_definitions(-DCURL_STATICLIB)
else(CURLSTATIC)
    find_package(CURL)
    if(CURL_FOUND)
        list(APPEND DXDE_INCLUDE_DIRS ${CURL_INCLUDE_DIRS})
        list(APPEND DXDE_LIBS ${CURL_LIBRARIES})
        set(HAVE_CURL TRUE)
    else()
        set(CURL_INCLUDE_DIR "" CACHE PATH "Path to curl include dir")
        set(CURL_LIBRARY "" CACHE FILEPATH "Filepath to curl library")
        if(CURL_INCLUDE_DIR AND CURL_LIBRARY)
            set(CURL_FOUND TRUE)
            set(HAVE_CURL TRUE)
            list(APPEND DXDE_LIBS ${CURL_LIBRARY})
            list(APPEND DXDE_INCLUDE_DIRS ${CURL_INCLUDE_DIR})
        endif()
    endif()
endif(CURLSTATIC)

if(NOT CURL_FOUND)
    message(FATAL_ERROR "Curl library not found. Can't build dxde")
endif()

set(HAVE_OPENSSL FALSE)
find_package(OpenSSL)
if(OPENSSL_FOUND)
    if(WIN32)
        # On windows/mingw we need libeay32 too...
        find_library(LIB_EAY NAMES libeay32MD eay libeay libeay32)
        if(LIB_EAY)
            list(APPEND DXDE_INCLUDE_DIRS ${OPENSSL_INCLUDE_DIR})
            list(APPEND DXDE_LIBS ${OPENSSL_LIBRARIES} ${LIB_EAY})
            set(HAVE_OPENSSL TRUE)
        endif()
    else()
        list(APPEND DXDE_INCLUDE_DIRS ${OPENSSL_INCLUDE_DIR})
        list(APPEND DXDE_LIBS ${OPENSSL_LIBRARIES})
        set(HAVE_OPENSSL TRUE)
    endif()
else()
    message(FATAL_ERROR "OpenSSL library not found. Can't build dxde")
endif()

if(NOT WIN32 AND NOT APPLE)
    find_package(PkgConfig)
    if(PKG_CONFIG_FOUND)
        pkg_check_modules(FONTCONFIG fontconfig)
        list(APPEND DXDE_INCLUDE_DIRS ${FONTCONFIG_INCLUDE_DIRS})
        list(APPEND DXDE_LIBS ${FONTCONFIG_LIBRARIES})
    endif(PKG_CONFIG_FOUND)
    if(NOT FONTCONFIG_FOUND)
        set(FONTCONFIG_INCLUDE_DIRS "" CACHE PATH "Path to fontconfig include dir")
        set(FONTCONFIG_LIBRARIES "" CACHE FILEPATH "Filepath to fontconfig library")
        if(FONTCONFIG_INCLUDE_DIRS AND FONTCONFIG_LIBRARIES)
            set(FONTCONFIG_FOUND true)
        endif()
        list(APPEND DXDE_INCLUDE_DIRS ${FONTCONFIG_INCLUDE_DIRS})
        list(APPEND DXDE_LIBS ${FONTCONFIG_LIBRARIES})
    endif(NOT FONTCONFIG_FOUND)
endif(NOT WIN32 AND NOT APPLE)

if(NOT WIN32)
# Source distribution
set(ARCHIVE_NAME ${CMAKE_PROJECT_NAME}-${PROJECT_VERSION})
add_custom_target(dist COMMAND cd ${CMAKE_CURRENT_SOURCE_DIR} &&
    rm -rf ${ARCHIVE_NAME} &&
    mkdir -p ${ARCHIVE_NAME} &&
    git archive master | tar -x -C ${ARCHIVE_NAME} &&
    tar czf ${ARCHIVE_NAME}.tar.gz ${ARCHIVE_NAME} &&
    rm -rf ${ARCHIVE_NAME}
)
endif(NOT WIN32)

add_subdirectory(src/model/lib)
add_subdirectory(resources)

set(SRCS
src/dxde.cpp
src/utils/dxsettings.cpp
src/utils/dxutils.cpp
src/gui/widgets/dxlistctrl.cpp
src/gui/widgets/dxtoolbar.cpp
src/gui/dialogs/firmadialog.cpp
src/gui/dialogs/kontaktdialog.cpp
src/gui/dialogs/kontaktydialog.cpp
src/gui/dialogs/predkontacedialog.cpp
src/gui/dialogs/predkontacesdialog.cpp
src/gui/dialogs/bankadialog.cpp
src/gui/dialogs/bankydialog.cpp
src/gui/dialogs/pokladnadialog.cpp
src/gui/dialogs/pokladnydialog.cpp
src/gui/dialogs/prijemvydejdialog.cpp
src/gui/dialogs/radadialog.cpp
src/gui/dialogs/polozkadialog.cpp
src/gui/dialogs/fakturadialog.cpp
src/gui/dialogs/zavpohdialog.cpp
src/gui/dialogs/uhradadialog.cpp
src/gui/dialogs/majetekdialog.cpp
src/gui/dialogs/predvolbydialog.cpp
src/gui/dialogs/fauhradadialog.cpp
src/gui/dialogs/fauhradydialog.cpp
src/gui/dialogs/datumdialog.cpp
src/gui/dialogs/sendemaildialog.cpp
src/gui/dialogs/odeslanedialog.cpp
src/gui/dialogs/dphdruhydialog.cpp
src/gui/dialogs/zalohadialog.cpp
src/gui/dialogs/skladdialog.cpp
src/gui/dialogs/skladydialog.cpp
src/gui/dialogs/zasobadialog.cpp
src/gui/dialogs/pohybzasobdialog.cpp
src/gui/dialogs/inventuradialog.cpp
src/gui/dialogs/inventurydialog.cpp
src/gui/wizards/firmawizard.cpp
src/gui/dialogs/zasobydialog.cpp
src/gui/dialogs/uhradydialog.cpp
src/gui/dialogs/neuhrazenedialog.cpp
src/gui/dialogs/vozidlodialog.cpp
src/gui/dialogs/vozidladialog.cpp
src/gui/dialogs/jizdadialog.cpp
src/gui/dialogs/nahradadialog.cpp
src/gui/pages/dxbook.cpp
src/gui/pages/homepage.cpp
src/gui/pages/denikpage.cpp
src/gui/pages/pokladnapage.cpp
src/gui/pages/bankapage.cpp
src/gui/pages/vydanapage.cpp
src/gui/pages/prijatapage.cpp
src/gui/pages/pohledavkapage.cpp
src/gui/pages/zavazekpage.cpp
src/gui/pages/majetekpage.cpp
src/gui/pages/skladpage.cpp
src/gui/pages/jizdapage.cpp
src/gui/prints/listdenikprint.cpp
src/gui/prints/simpledenikprint.cpp
src/gui/prints/fulldenikprint.cpp
src/gui/prints/knihafakturprint.cpp
src/gui/prints/knihazavpohprint.cpp
src/gui/prints/knihamajetkuprint.cpp
src/gui/prints/pokladniknihaprint.cpp
src/gui/prints/bankaknihaprint.cpp
src/gui/prints/pokladnidokladprint.cpp
src/gui/prints/bankovnidokladprint.cpp
src/gui/prints/kartamajetkuprint.cpp
src/gui/prints/fakturaneplatceprint.cpp
src/gui/prints/fakturaplatceprint.cpp
src/gui/prints/zavpohprint.cpp
src/gui/prints/fakturaxmlprint.cpp
src/gui/prints/kartazasobyprint.cpp
src/gui/prints/knihazasobprint.cpp
src/gui/prints/inventuraprint.cpp
src/gui/prints/knihainventurprint.cpp
src/gui/prints/jizdaprint.cpp
src/gui/prints/knihajizdprint.cpp
src/gui/prints/nahradaprint.cpp
src/gui/template/templateeditor.cpp
src/gui/template/templateprint.cpp
src/gui/template/canvases.cpp
src/gui/template/dokumentdialog.cpp
src/gui/template/linedialog.cpp
src/gui/template/textdialog.cpp
src/gui/template/imagedialog.cpp
src/gui/template/paragraphdialog.cpp
src/gui/template/rowdialog.cpp
src/gui/template/rectdialog.cpp
src/gui/template/tags.cpp
src/gui/taxes/seznamdphdialog.cpp
src/gui/taxes/seznamdphprint.cpp
src/gui/taxes/atribut.cpp
src/gui/taxes/veta.cpp
src/gui/taxes/dphdp3print.cpp
src/gui/taxes/priznanidialog.cpp
src/gui/taxes/okecdialog.cpp
src/gui/taxes/dphdp3.cpp
src/gui/taxes/dphdp3wizard.cpp
src/gui/taxes/prijmyvydajedialog.cpp
src/gui/taxes/prijmyvydajeprint.cpp
src/gui/taxes/dphshv.cpp
src/gui/taxes/dphshwizard.cpp
src/gui/taxes/dphshvetardialog.cpp
src/gui/taxes/dphshprint.cpp
src/gui/taxes/dphkh1.cpp
src/gui/taxes/dphkh1wizard.cpp
src/gui/taxes/dphkh1print.cpp
src/gui/taxes/dphkh1vetaa1dialog.cpp
src/gui/taxes/dphkh1vetaa2dialog.cpp
src/gui/taxes/dphkh1vetaa3dialog.cpp
src/gui/taxes/dphkh1vetaa4dialog.cpp
src/gui/taxes/dphkh1vetab1dialog.cpp
src/gui/taxes/dphkh1vetab2dialog.cpp
src/gui/taxes/ulozenedialog.cpp
src/gui/taxes/majetekzavazkydialog.cpp
src/gui/taxes/majetekzavazkyprint.cpp
src/gui/filters/filter.cpp
src/gui/filters/jizdafilter.cpp
src/gui/filters/denikfilter.cpp
src/gui/filters/pokladnafilter.cpp
src/gui/filters/bankafilter.cpp
src/gui/filters/vydanafilter.cpp
src/gui/filters/prijatafilter.cpp
src/gui/filters/pohledavkafilter.cpp
src/gui/filters/zavazekfilter.cpp
src/gui/filters/majetekfilter.cpp
src/gui/filters/skladfilter.cpp
src/gui/filters/dphdruhfilter.cpp
src/model/dbmodel.cpp
src/model/data/adresa.cpp
src/model/data/firma.cpp
src/model/data/kontakt.cpp
src/model/data/obdobi.cpp
src/model/data/dphsazba.cpp
src/model/data/dphdruh.cpp
src/model/data/mena.cpp
src/model/data/deniksloupec.cpp
src/model/data/predkontace.cpp
src/model/data/denik.cpp
src/model/data/pokladna.cpp
src/model/data/banka.cpp
src/model/data/rada.cpp
src/model/data/kurz.cpp
src/model/data/fatyp.cpp
src/model/data/fauhrada.cpp
src/model/data/fapolozka.cpp
src/model/data/faktura.cpp
src/model/data/zavpoh.cpp
src/model/data/uhrada.cpp
src/model/data/odpiskupina.cpp
src/model/data/majetek.cpp
src/model/data/odpis.cpp
src/model/data/settings.cpp
src/model/data/smtp.cpp
src/model/data/odeslany.cpp
src/model/data/fadphsazba.cpp
src/model/data/priznani.cpp
src/model/data/ulozene.cpp
src/model/data/dphdoklad.cpp
src/model/data/sklad.cpp
src/model/data/zasoba.cpp
src/model/data/pohybzasob.cpp
src/model/data/inventura.cpp
src/model/data/ivpolozka.cpp
src/model/data/ridic.cpp
src/model/data/phm.cpp
src/model/data/druhvozidla.cpp
src/model/data/vozidlo.cpp
src/model/data/jizda.cpp
src/model/data/bankovniustav.cpp
src/print/dxprint.cpp
src/print/styles.cpp
src/print/table.cpp
src/print/elements.cpp
src/print/document.cpp
src/print/tableprint.cpp
src/print/splittableprint.cpp
src/print/multitableprint.cpp
src/print/documentprint.cpp
)

set(SMTP_SRCS
src/smtp/wxEmailMessageID.cpp
src/smtp/wxEmailMessage.cpp
src/smtp/wxMailer.cpp
)

set(PDF_SRCS
src/pdf/src/pdfannotation.cpp
src/pdf/src/pdfbarcode.cpp
src/pdf/src/pdfcffdecoder.cpp
src/pdf/src/pdfcffindex.cpp
src/pdf/src/pdfcolour.cpp
src/pdf/src/pdfdc.cpp
src/pdf/src/pdfdecode.cpp
src/pdf/src/pdfdocument.cpp
src/pdf/src/pdfencoding.cpp
src/pdf/src/pdfencrypt.cpp
src/pdf/src/pdffont.cpp
src/pdf/src/pdffontdata.cpp
src/pdf/src/pdffontdatacore.cpp
src/pdf/src/pdffontdataopentype.cpp
src/pdf/src/pdffontdatatruetype.cpp
src/pdf/src/pdffontdatatype0.cpp
src/pdf/src/pdffontdatatype1.cpp
src/pdf/src/pdffontdescription.cpp
src/pdf/src/pdffontdetails.cpp
src/pdf/src/pdffontextended.cpp
src/pdf/src/pdffontmanager.cpp
src/pdf/src/pdffontparser.cpp
src/pdf/src/pdffontparsertruetype.cpp
src/pdf/src/pdffontparsertype1.cpp
src/pdf/src/pdffontsubsetcff.cpp
src/pdf/src/pdffontsubsettruetype.cpp
src/pdf/src/pdffontvolt.cpp
src/pdf/src/pdfform.cpp
src/pdf/src/pdfgradient.cpp
src/pdf/src/pdfgraphics.cpp
src/pdf/src/pdfimage.cpp
src/pdf/src/pdfkernel.cpp
src/pdf/src/pdflayer.cpp
src/pdf/src/pdfobjects.cpp
src/pdf/src/pdfocg.cpp
src/pdf/src/pdfparser.cpp
src/pdf/src/pdfpattern.cpp
src/pdf/src/pdfprint.cpp
src/pdf/src/pdfrijndael.cpp
src/pdf/src/pdftemplate.cpp
src/pdf/src/pdfutility.cpp
src/pdf/src/pdfxml.cpp
)

set(QR_SRCS
src/qrcode/QrCode.cpp
)

if(WIN32)
    set(SRCS ${SRCS} src/resource.rc)
endif(WIN32)

if(NOT WIN32)
    if(APPLE)
    add_definitions(-DLOCALEDIR="../Resources/locale")
    add_definitions(-DDXDE_DATADIR="../Resources")
    else()
    add_definitions(-DLOCALEDIR="${CMAKE_INSTALL_PREFIX}/share/locale")
    add_definitions(-DDXDE_DATADIR="${CMAKE_INSTALL_PREFIX}/share/dxde")
    endif(APPLE)
else()
    add_definitions(-DLOCALEDIR="./locale")
    add_definitions(-DDXDE_DATADIR=".")
    add_definitions(-DWXMAKINGLIB_PDFDOC)
    list(APPEND DXDE_LIBS ws2_32)
endif(NOT WIN32)

configure_file(config.h.cmake
               ${CMAKE_CURRENT_BINARY_DIR}/config.h
)

include_directories(${CMAKE_CURRENT_BINARY_DIR}
 ${CMAKE_CURRENT_SOURCE_DIR}
 ${CMAKE_CURRENT_SOURCE_DIR}/src
 ${CMAKE_CURRENT_SOURCE_DIR}/src/pdf/include
 ${CMAKE_BINARY_DIR}
 ${WXSQLITE3_INCLUDE_DIRS}
 ${DXDE_INCLUDE_DIRS}
)

if(APPLE)
    set(PROGNAME dxde)
    set(MACOSX_BUNDLE_ICON_FILE dxde.icns)
    set(MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION})
    set(MACOSX_BUNDLE_VERSION ${PROJECT_VERSION})
    set(MACOSX_BUNDLE_LONG_VERSION_STRING Version ${PROJECT_VERSION})
    set(SOURCES ${SOURCES} ${CMAKE_CURRENT_SOURCE_DIR}/resources/images/dxde.icns)
    add_executable(dxde MACOSX_BUNDLE ${SRCS} ${SMTP_SRCS} ${PDF_SRCS} ${QR_SRCS})
    set(dxde_RESOURCE_DIR ${CMAKE_CURRENT_BINARY_DIR}/dxde.app/Contents/Resources)
    set(dxde_HELP_DIR ${CMAKE_CURRENT_BINARY_DIR}/dxde.app/Contents/Resources/help)
    set(dxde_TEMPLATE_DIR ${CMAKE_CURRENT_BINARY_DIR}/dxde.app/Contents/Resources/templates)
    set(DXDE_FRAMEWORKS "-framework Security")
    ADD_CUSTOM_COMMAND(TARGET dxde POST_BUILD
    COMMAND mkdir ARGS -p ${dxde_RESOURCE_DIR}
    COMMAND mkdir ARGS -p ${dxde_HELP_DIR}
    COMMAND mkdir ARGS -p ${dxde_TEMPLATE_DIR}
    COMMAND cp ARGS -f ${CMAKE_CURRENT_SOURCE_DIR}/resources/images/${MACOSX_BUNDLE_ICON_FILE} ${dxde_RESOURCE_DIR}
    COMMAND cp ARGS -f ${CMAKE_CURRENT_SOURCE_DIR}/resources/help/*.hhc ${dxde_HELP_DIR}
    COMMAND cp ARGS -f ${CMAKE_CURRENT_SOURCE_DIR}/resources/help/*.hhk ${dxde_HELP_DIR}
    COMMAND cp ARGS -f ${CMAKE_CURRENT_SOURCE_DIR}/resources/help/*.hhp ${dxde_HELP_DIR}
    COMMAND cp ARGS -f ${CMAKE_CURRENT_SOURCE_DIR}/resources/help/*.htm ${dxde_HELP_DIR}
    COMMAND cp ARGS -f ${CMAKE_CURRENT_SOURCE_DIR}/resources/help/*.png ${dxde_HELP_DIR}
    COMMAND cp ARGS -f ${CMAKE_CURRENT_SOURCE_DIR}/resources/templates/*.xml ${dxde_TEMPLATE_DIR}
    COMMENT Setting up resources)
else()
    add_executable(dxde WIN32 ${SRCS} ${SMTP_SRCS} ${PDF_SRCS} ${QR_SRCS})
endif(APPLE)

target_link_libraries(dxde ${DXDE_LIBS} ${WXSQLITE3_LIBRARIES} ${wxWidgets_LIBRARIES} ${DXDE_FRAMEWORKS})

install(TARGETS dxde DESTINATION bin)

# uninstall target
configure_file(
    ${CMAKE_CURRENT_SOURCE_DIR}/cmake/uninstall.cmake.in
    ${CMAKE_CURRENT_BINARY_DIR}/cmake/uninstall.cmake
    IMMEDIATE @ONLY)
add_custom_target(uninstall
    ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake/uninstall.cmake)

message(STATUS "dxde")
message(STATUS "Install prefix:    ${CMAKE_INSTALL_PREFIX}")
message(STATUS "Build type:        ${CMAKE_BUILD_TYPE}")
message(STATUS "wxWidgets version: ${WX_VERSION}")
if(NOT APPLE AND NOT MINGW)
    message(STATUS " gtk version:      ${GTK_VERSION}")
endif()
message(STATUS "Curl version:      ${PC_CURL_VERSION}")
message(STATUS "OpenSSL version:   ${OPENSSL_VERSION}")
