set(BANK_WEBSITE_HOST https://www.bundesbank.de)
set(BANK_WEBSITE_PATH /de/aufgaben/unbarer-zahlungsverkehr/serviceangebot/bankleitzahlen/download---bankleitzahlen-602592)
# format description
#https://www.bundesbank.de/resource/blob/602848/50cba8afda2b0b1442016101cfd7e084/mL/merkblatt-bankleitzahlendatei-data.pdf

# https://www.betaalvereniging.nl/en/focus/giro-based-and-online-payments/business-identifier-code-bic-for-sepa-transactions/
set(NL_BANK_WEBSITE_URL "https://www.betaalvereniging.nl/wp-content/uploads/BIC-lijst-NL-2.xlsx")

set(CH_RAW_DATA_URL "https://api.six-group.com/api/epcd/bankmaster/v2/public/downloads/bcbankenstamm")

# https://www.bundesbank.de/de/startseite/verzeichnis-der-erreichbaren-zahlungsdienstleister-list-of-reachable-payment-service-providers-602880
set(SEPA_URL https://www.bundesbank.de/resource/blob/602880/c9e0b10e3678615c2651a61c004ba850/mL/verzeichnis-der-erreichbaren-zahlungsdienstleister-data.csv)

# bankdata related variables
set(BANKDATA_SRCPATH ${CMAKE_SOURCE_DIR}/data)

set(BANK_WEBSITE_URL ${BANK_WEBSITE_HOST}${BANK_WEBSITE_PATH})
set(NL_RAW_DATA_PATH "${BANKDATA_SRCPATH}/nl_data.xlsx")
set(CH_RAW_DATA_PATH "${BANKDATA_SRCPATH}/ch_data.txt")
set(TEMP_FILE "${CMAKE_CURRENT_BINARY_DIR}/tmpfile.txt")
set(SEARCH_FILENAME blz-.*-txt-data.txt)
set(SEARCH_CH_FILENAME bankenstamm)


# bankdata database related variables
set(BANKDATA_DB "bankdata.de.db")
set(BANKDATA_NL_DB "bankdata.nl.db")
set(BANKDATA_CH_DB "bankdata.ch.db")
set(BANKDATA_TEST_DB "bankdata.test.db")

set(BANKDATA_DBPATH "${BANKDATA_SRCPATH}/${BANKDATA_DB}")
set(BANKDATA_NL_DBPATH "${BANKDATA_SRCPATH}/${BANKDATA_NL_DB}")
set(BANKDATA_CH_DBPATH "${BANKDATA_SRCPATH}/${BANKDATA_CH_DB}")
set(BANKDATA_TEST_DBPATH "${BANKDATA_SRCPATH}/${BANKDATA_TEST_DB}")

list(APPEND ADDITIONAL_CLEAN_FILES ${BANKDATA_TEST_DBPATH})

message(STATUS "Using bank data db ${BANKDATA_DBPATH}")
message(STATUS "Using bank data db ${BANKDATA_NL_DBPATH}")
message(STATUS "Using bank data db ${BANKDATA_CH_DBPATH}")
message(STATUS "Using bank data db ${BANKDATA_TEST_DBPATH}")

set(VALID_END_DATE "")

if(ENABLE_BANKDATA_DOWNLOAD)
    extract_date(
        URL ${BANK_WEBSITE_URL}
        OUTPUT ${TEMP_FILE}
        REGEX "gültig vom [^ ]+ bis [^<]*"
        RESULT_START_DATE VALID_START_DATE
        RESULT_END_DATE VALID_END_DATE
    )
    date_to_timestamp(${VALID_START_DATE} RESULT TIMESTAMP)
    string(TIMESTAMP _BANKDATA_RAW_FILE "blz_${TIMESTAMP}.txt")
    set(BANKDATA_RAW_FILE ${_BANKDATA_RAW_FILE})
    set(BANKDATA_RAW_FILEPATH "${BANKDATA_SRCPATH}/${BANKDATA_RAW_FILE}")
    message(STATUS "Using raw bank data file ${BANKDATA_RAW_FILEPATH}")
else()
    file(GLOB BANKDATA_RAW_FILEPATHS  "${BANKDATA_SRCPATH}/blz_2*.txt")
    list(SORT BANKDATA_RAW_FILEPATHS COMPARE FILE_BASENAME)
    list(POP_BACK BANKDATA_RAW_FILEPATHS BANKDATA_RAW_FILEPATH)
    get_filename_component(BANKDATA_RAW_FILE ${BANKDATA_RAW_FILEPATH} NAME)
    message(STATUS "Using present raw bank data file ${BANKDATA_RAW_FILEPATH}")
endif()
set(BANKDATA_TEST_FILEPATH "${BANKDATA_SRCPATH}/bankdata_test.txt")

set(BANKDATA_PATH ${CMAKE_INSTALL_FULL_DATADIR}/ktoblzcheck)

if(ENABLE_BANKDATA_DOWNLOAD)
    # generate cmake script for downloading bank data file
    file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/de_data.cmake "
        file(DOWNLOAD \"${BANK_WEBSITE_URL}\" \"${TEMP_FILE}\")
        file(READ \"${TEMP_FILE}\" DATA)
        #message(\"\${DATA}\")
        string(REGEX REPLACE \".*href=\\\"(.*/${SEARCH_FILENAME})\\\".*\" \"${BANK_WEBSITE_HOST}\\\\1\" FILE_URL  \"\${DATA}\")
        message(\"got file url \${FILE_URL}\")
        file(DOWNLOAD \"\${FILE_URL}\" \"${BANKDATA_RAW_FILEPATH}\")
    ")

    file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/nl_data.cmake "
        file(DOWNLOAD \"${NL_BANK_WEBSITE_URL}\" \"${NL_RAW_DATA_PATH}\")
    ")

    file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/ch_data.cmake "
        file(DOWNLOAD \"${CH_RAW_DATA_URL}\" \"${CH_RAW_DATA_PATH}\")
    ")

    # fetch raw bankdata file
    add_custom_command(
        OUTPUT ${BANKDATA_RAW_FILEPATH}
        COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/de_data.cmake
        WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
        COMMENT "Download raw bank data file to ${BANKDATA_RAW_FILEPATH}"
    )

    add_custom_command(
        OUTPUT ${NL_RAW_DATA_PATH}
        COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/nl_data.cmake
        WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
        COMMENT "Download raw bank data file to ${NL_RAW_DATA_PATH}"
    )

    add_custom_command(
        OUTPUT ${CH_RAW_DATA_PATH}
        COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/ch_data.cmake
        WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
        COMMENT "Download raw bank data file to ${CH_RAW_DATA_PATH}"
    )
    add_custom_target(fetch_bankdata
        DEPENDS ${BANKDATA_RAW_FILENAME}
    )
endif()


if(VALID_END_DATE)
add_custom_command(
    OUTPUT  ${BANKDATA_DBPATH}
    COMMAND ${Python_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/update-database.py -o ${BANKDATA_DBPATH} ${BANKDATA_RAW_FILEPATH} ${VALID_END_DATE}
    DEPENDS ${BANKDATA_RAW_FILEPATH}
    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
)
endif()

add_custom_command(
    OUTPUT  ${BANKDATA_NL_DBPATH}
    COMMAND ${Python_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/netherlands.py -o ${BANKDATA_NL_DBPATH} ${NL_RAW_DATA_PATH}
    DEPENDS ${NL_RAW_DATA_PATH}
    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
)

add_custom_command(
    OUTPUT  ${BANKDATA_CH_DBPATH}
    COMMAND ${Python_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/switzerland.py -o ${BANKDATA_CH_DBPATH} ${CH_RAW_DATA_PATH}
    DEPENDS ${CH_RAW_DATA_PATH}
    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
)

add_custom_command(
    OUTPUT  ${BANKDATA_TEST_DBPATH}
    COMMAND ${Python_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/update-database.py -o ${BANKDATA_TEST_DBPATH} -t ${BANKDATA_TEST_FILEPATH} 2022-01-01
    DEPENDS ${BANKDATA_TEST_FILEPATH}
    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
)

add_custom_target(bankdata_de
    DEPENDS ${BANKDATA_FILEPATH}
)

add_custom_target(bankdata_db
    DEPENDS ${BANKDATA_DBPATH}
)

add_custom_target(bankdata_nl_db
    DEPENDS ${BANKDATA_NL_DBPATH}
)

add_custom_target(bankdata_ch_db
    DEPENDS ${BANKDATA_CH_DBPATH}
)

add_custom_target(bankdata_test_db
    DEPENDS ${BANKDATA_TEST_DBPATH}
)

set(INSTALL_FILES
    ${BANKDATA_FILEPATH} # to be removed
    ${BANKDATA_DBPATH}
    ${BANKDATA_NL_DBPATH}
    ${BANKDATA_CH_DBPATH}
    ${BANKDATA_SRCPATH}/ibandata.txt
)

if(INSTALL_RAW_BANKDATA_FILE)
    list(APPEND INSTALL_FILES ${BANKDATA_RAW_FILEPATH})
endif()

install(FILES ${INSTALL_FILES} DESTINATION share/${INSTALL_PROJECT_NAME})

if(ENABLE_BANKDATA_DOWNLOAD)
    #
    # sepa data
    #
    extract_date(
        URL ${SEPA_URL}
        REGEX "Gueltig ab / valid from ([^ ;]*)"
        OUTPUT ${TEMP_FILE}
        RESULT_START_DATE SEPA_START_DATE
    )

    date_to_timestamp(${SEPA_START_DATE} RESULT SEPA_TIMESTAMP)

    # returns target path in DATA_FILEPATH_<KEY>
    fetch_file(
        KEY sepa
        URL ${SEPA_URL}
        TIMESTAMP ${SEPA_TIMESTAMP}
    )
    list(APPEND ALL_DEPS fetch_sepa)
endif()

if(INSTALL_SEPA_BANKDATA_FILE)
    install(FILES ${DATA_FILEPATH_sepa} DESTINATION share/${INSTALL_PROJECT_NAME})
endif()

add_custom_target(default ALL
    DEPENDS
        bankdata_db
        bankdata_nl_db
        bankdata_ch_db
        ${ALL_DEPS}
)
