cmake_minimum_required(VERSION 3.13 FATAL_ERROR)

find_program(OpenSSL_EXECUTABLE
  NAMES "openssl"
  HINTS "${TurretApiCpp_SOURCE_DIR}/external/OpenSSL/bin"
  DOC "OpenSSL executable"
)

set(CA_CERT "trusted-cert.pem")
set(CA_KEY "ca.key")
set(PUBLIC_KEY "server-cert.pem")
set(PRIVATE_KEY "server-key.pem")
set(CERT_SAN_INFOFILE "cert.conf")

add_executable(encryption encryption.cpp ${CA_CERT} ${PUBLIC_KEY} ${PRIVATE_KEY})
target_link_libraries(encryption
  PRIVATE TurretApi
)
set_target_properties(encryption PROPERTIES
  VS_DEBUGGER_ENVIRONMENT "Path=$(Path)\;${BOOST_ROOT}/bin/$<CONFIG>\;${OPENSSL_ROOT_DIR}/bin"
)

if (OpenSSL_EXECUTABLE-NOTFOUND)
  message(FATAL_ERROR "OpenSSL executable not found")
endif()

set(country "HU")
set(organization "Unify")
set(ca_common_name "development-ca")
set(client_common_name "development-cert")

set(ca_subject "/C=${country}/O=${organization}/CN=${ca_common_name}")
set(client_subject "/C=${country}/O=${organization}/CN=${client_common_name}")

cmake_host_system_information(RESULT domain_name QUERY FQDN)
set(ip_address "192.168.8.69")

configure_file("cert.conf.in" ${CERT_SAN_INFOFILE} @ONLY)

add_custom_command(OUTPUT ${CA_KEY}
  COMMAND ${OpenSSL_EXECUTABLE} genrsa -out ${CA_KEY} 2048
  WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
  COMMENT "Generating CA key"
)

add_custom_command(
  OUTPUT ${CA_CERT}
  COMMAND ${OpenSSL_EXECUTABLE} req
          -x509 -new -nodes -key ${CA_KEY} -days 3650 -out ${CA_CERT}
          -subj ${ca_subject}
  DEPENDS ${CA_KEY}
  WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
  COMMENT "Generating CA certificate"
)

add_custom_command(OUTPUT ${PRIVATE_KEY}
  COMMAND ${OpenSSL_EXECUTABLE} genrsa -out ${PRIVATE_KEY} 2048
  WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
  COMMENT "Generating private key"
)

add_custom_command(
  OUTPUT ${PUBLIC_KEY}
  COMMAND ${OpenSSL_EXECUTABLE} req -new -key ${PRIVATE_KEY} -out server.csr
          -subj ${client_subject}
  COMMAND ${OpenSSL_EXECUTABLE} x509 -req -days 365
          -CA ${CA_CERT} -CAkey ${CA_KEY} -CAcreateserial
          -in server.csr -out ${PUBLIC_KEY}
          -extensions san_ext -extfile ${CERT_SAN_INFOFILE}
  DEPENDS ${CA_KEY} ${CA_CERT} ${PRIVATE_KEY}
  BYPRODUCTS "server.csr"
  WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
  COMMENT "Generating public key"
)

install(TARGETS encryption
  RUNTIME DESTINATION bin
)
install(CODE "
include(BundleUtilities)
file(GLOB _executables \$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/bin/encryption*)
message(STATUS \"\${_executables}\")
fixup_bundle(\"\${_executables}\" \"\" \"${OPENSSL_ROOT_DIR}/bin\")
"
)

# TODO: install required certs?