find_program(WIX_HEAT heat)
find_program(WIX_CANDLE candle)
find_program(WIX_LIGHT light)
find_program(WIX_INSIGNIA insignia)

get_filename_component(WIX_BIN_DIR ${WIX_CANDLE} DIRECTORY)

configure_file(${PROJECT_SOURCE_DIR}/bundle/win/Version.wxi.in Version.wxi)

set(WIX_VARIABLES -dDeploymentPath="${CMAKE_INSTALL_PREFIX}" -dOutputPath="${CMAKE_BINARY_DIR}")

include(CMakeParseArguments)

function(wix_harvest_directory dir fragment)
  set(ARGS REFVARIABLE CGROUP DEPENDS)
  cmake_parse_arguments(_WHD "" "${ARGS}" "" ${ARGN})
  
  if(NOT _WHD_REFVARIABLE)
    set(_WHD_REFVARIABLE INSTALLLOCATION)
  endif()
  
  if(_WHD_CGROUP)
    set(CGROUP -cg ${_WHD_CGROUP})
  endif()
  
  add_custom_command(OUTPUT ${fragment}
                     DEPENDS ${_WHD_DEPENDS}
                     COMMAND ${WIX_HEAT} dir "${dir}" -srd -nologo -sw5150 ${CGROUP} -dr ${_WHD_REFVARIABLE} -ag -out ${fragment} -var var.DeploymentPath
                     COMMENT "Harvesting dir ${dir} to ${fragment}")
  add_custom_target(heat_${fragment} DEPENDS ${fragment})
  
endfunction()

function(wix_get_extension VARIABLE)
  foreach(f ${ARGN})
    find_file(${f}_PATH ${f}.dll PATHS ${WIX_BIN_DIR})
    set(EXTS ${EXTS} -ext ${${f}_PATH})
  endforeach()
  
  set(${VARIABLE} ${EXTS} PARENT_SCOPE)
endfunction()

function(wix_candle wsxfile)
  set(ARGS OUTPUT ARCH)
  set(MARGS EXTENSIONS)
  cmake_parse_arguments(_WC "" "${ARGS}" "${MARGS}" ${ARGN})
  
  if(NOT _WC_OUTPUT)
    get_filename_component(WC_BASENAME ${wsxfile} NAME_WE)
    set(_WC_OUTPUT ${WC_BASENAME}.wixobj)
  endif()
  
  if(NOT _WC_ARCH)
    set(_WC_ARCH x64)
  endif()
  
  if(_WC_EXTENSIONS)
    wix_get_extension(WIX_EXTENSIONS ${_WC_EXTENSIONS})
  endif()
  
  add_custom_command(OUTPUT ${_WC_OUTPUT}
                     DEPENDS ${wsxfile}
                     COMMAND ${WIX_CANDLE} -nologo ${WIX_VARIABLES} -I${CMAKE_CURRENT_BINARY_DIR} -arch ${_WC_ARCH} ${wsxfile} ${WIX_EXTENSIONS} -out ${_WC_OUTPUT}
                     COMMENT "Candle file ${_WC_OUTPUT}"
                     )  
endfunction()

function(wix_light)
  set(MARGS OBJS DEPENDS EXTENSIONS)
  set(ARGS OUTPUT BASEDIR TARGET)
  cmake_parse_arguments(_WL "" "${ARGS}" "${MARGS}" ${ARGN})
  
  if(NOT _WL_OUTPUT)
    message(FATAL_ERROR "Need OUTPUT")
  endif()
  
  if(_WL_EXTENSIONS)
    wix_get_extension(WIX_EXTENSIONS ${_WL_EXTENSIONS})
  endif()
  
  if(_WL_BASEDIR)
    set(_WL_BASEDIR -b ${_WL_BASEDIR})
  endif()
  
  if(NOT _WL_TARGET)
    set(_WL_TARGET wix_${_WL_OUTPUT})
  endif()
  
    
  add_custom_command(OUTPUT ${_WL_OUTPUT}
                     DEPENDS ${_WL_OBJS} ${_WL_DEPENDS}
                     COMMAND ${WIX_LIGHT} -nologo ${_WL_BASEDIR} ${_WL_OBJS} ${WIX_VARIABLES} ${WIX_EXTENSIONS} -out ${_WL_OUTPUT}
                     COMMENT "Light it up: ${_WL_OUTPUT}")

                 
  add_custom_target(${_WL_TARGET} DEPENDS ${_WL_OUTPUT})
  
  if(CODE_SIGN)
    if(_WL_OUTPUT MATCHES ".*exe")
      add_custom_command(TARGET ${_WL_TARGET} POST_BUILD
        COMMAND ${WIX_INSIGNIA} -ib ${_WL_OUTPUT} -o engine.exe
        COMMAND ${CMAKE_SOURCE_DIR}/scripts/WindowsSign.cmd engine.exe
        COMMAND ${WIX_INSIGNIA} -ab engine.exe ${_WL_OUTPUT} -o ${_WL_OUTPUT}
        COMMENT "Doing insignia dance"
      )
    endif()
    add_custom_command(TARGET ${_WL_TARGET} POST_BUILD
                       COMMAND ${CMAKE_SOURCE_DIR}/scripts/WindowsSign.cmd ${_WL_OUTPUT}
                       COMMENT Signing ${_WL_OUTPUT}
    )
  endif()
endfunction()

function(wix_create_installer output)
  set(MARGS WXS_FILES EXTENSIONS DEPENDS)
  set(ARGS ARCH BASEDIR TARGET)
  cmake_parse_arguments(_WCI "" "${ARGS}" "${MARGS}" ${ARGN})
  
  foreach(wxs ${_WCI_WXS_FILES})
    get_filename_component(WXSBASE ${wxs} NAME_WE)
    wix_candle(${wxs} OUTPUT ${WXSBASE}.wixobj EXTENSIONS ${_WCI_EXTENSIONS} ARCH ${_WCI_ARCH})
    list(APPEND WIXOBJS ${WXSBASE}.wixobj)
  endforeach()
  
  wix_light(OBJS ${WIXOBJS}
            EXTENSIONS ${_WCI_EXTENSIONS}
            OUTPUT ${output}
            DEPENDS ${_WCI_DEPENDS}
            BASEDIR ${_WCI_BASEDIR}
            TARGET ${_WCI_TARGET})
endfunction()

add_custom_target(wix_install
                  COMMAND ${CMAKE_COMMAND} -P cmake_install.cmake
                  COMMENT "Copying files..."
                  DEPENDS JellyfinMediaPlayer)

wix_harvest_directory("${CMAKE_INSTALL_PREFIX}" files.wxs CGROUP ProgramFilesComponentGroup DEPENDS wix_install)

wix_create_installer(PMP.msi 
                     WXS_FILES files.wxs "${PROJECT_SOURCE_DIR}/bundle/win/JMP.wxs"
                     EXTENSIONS WixUtilExtension WixFirewallExtension
                     BASEDIR "${PROJECT_SOURCE_DIR}/bundle/win"
)

if (CMAKE_SIZEOF_VOID_P MATCHES 8)
  set(INSTALLER_ARCH_STR windows-x64)
else()
  set(INSTALLER_ARCH_STR windows-x86)
endif()

wix_create_installer(JellyfinMediaPlayer-${VERSION_STRING}-${INSTALLER_ARCH_STR}.exe
                     TARGET JellyfinMediaPlayerInstaller
                     WXS_FILES "${PROJECT_SOURCE_DIR}/bundle/win/Bundle.wxs"
                     EXTENSIONS WixUtilExtension WixBalExtension
                     DEPENDS wix_PMP.msi
                     BASEDIR "${PROJECT_SOURCE_DIR}/bundle/win"
)

add_custom_target(windows_package DEPENDS JellyfinMediaPlayerInstaller)