cmake_minimum_required(VERSION 3.18)
project(minori LANGUAGES CXX VERSION 0.1.0)

if(APPLE)
	enable_language(OBJCXX)
endif()

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}")
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}")

option(BUILD_SHARED_LIBS "Build using shared libraries" ON)
option(USE_QT6 "Force build with Qt 6" OFF)
option(USE_QT5 "Force build with Qt 5" OFF)
option(UPDATE_TRANSLATIONS "Update *.ts translation files" OFF)

add_subdirectory(dep/anitomy)
add_subdirectory(dep/animia)
add_subdirectory(dep/pugixml)

# Fix for mingw64
list(APPEND CMAKE_FIND_LIBRARY_SUFFIXES ".dll.a" ".a")

if(USE_QT6)
	set(QT_VERSION_MAJOR 6)
elseif(USE_QT5)
	set(QT_VERSION_MAJOR 5)
else()
	find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core)
endif()

find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets LinguistTools)

find_package(CURL REQUIRED)

set(LIBRARIES
	${CURL_LIBRARIES}
	${Qt${QT_VERSION_MAJOR}Widgets_LIBRARIES}
	anitomy
	animia
	pugixml
)

# We need Cocoa for some OS X stuff
if(APPLE)
	find_library(COCOA_LIBRARY Cocoa)
	list(APPEND LIBRARIES ${COCOA_LIBRARY})
endif()

set(SRC_FILES
	# Main entrypoint
	src/main.cc

	# Core files and datatype declarations...
	src/core/anime.cc
	src/core/anime_db.cc
	src/core/config.cc
	src/core/date.cc
	src/core/filesystem.cc
	src/core/http.cc
	src/core/json.cc
	src/core/strings.cc
	src/core/time.cc

	# Main window
	src/gui/window.cc
	src/gui/theme.cc
	src/gui/locale.cc

	# Main window pages
	src/gui/pages/anime_list.cc
	src/gui/pages/now_playing.cc
	src/gui/pages/statistics.cc
	src/gui/pages/search.cc
	src/gui/pages/seasons.cc
	src/gui/pages/torrents.cc
	src/gui/pages/history.cc

	# Custom widgets
	src/gui/widgets/anime_info.cc
	src/gui/widgets/poster.cc
	src/gui/widgets/clickable_label.cc
	src/gui/widgets/sidebar.cc
	src/gui/widgets/text.cc
	src/gui/widgets/optional_date.cc

	# Dialogs
	src/gui/dialog/about.cc
	src/gui/dialog/information.cc
	src/gui/dialog/settings.cc
	src/gui/dialog/settings/application.cc
	src/gui/dialog/settings/services.cc
	src/gui/dialog/settings/torrents.cc
	src/gui/dialog/settings/recognition.cc

	# Translate
	src/gui/translate/anime.cc
	src/gui/translate/anilist.cc
	src/gui/translate/config.cc

	# Services (only AniList for now)
	src/services/services.cc
	src/services/anilist.cc

	# Tracking
	src/track/constants.cc
	src/track/media.cc
	src/track/types.cc

	# Qt resources
	rc/icons.qrc
	rc/dark.qrc
)

set(INCLUDE
	include
	dep/pugixml/src
	dep/animia/include
	dep/anitomy
	dep
)

set(TS_FILES
	rc/locale/en_GB.ts
	rc/locale/es.ts
)

set_source_files_properties(${TS_FILES} PROPERTIES OUTPUT_LOCATION "${CMAKE_CURRENT_BINARY_DIR}/rc/locale")

# dumb little hack to get this working on Qt5 and Qt6
if(UPDATE_TRANSLATIONS)
	cmake_language(CALL qt${QT_VERSION_MAJOR}_create_translation ${SRC_FILES} ${TS_FILES} OPTIONS "-I${CMAKE_CURRENT_SOURCE_DIR}/include")
endif()
cmake_language(CALL qt${QT_VERSION_MAJOR}_add_translation QM_FILES ${TS_FILES})
list(APPEND SRC_FILES ${QM_FILES})

function(qt_create_resource_file outfile)
	set(QRC "<!DOCTYPE rcc><RCC version=\"1.0\">\n\t<qresource>\n")
	get_filename_component(DIR ${outfile} DIRECTORY)
	foreach (qm ${ARGN})
		file(RELATIVE_PATH name ${DIR} ${qm})
		string(APPEND QRC "\t\t<file>${name}</file>\n")
	endforeach()
	string(APPEND QRC "\t</qresource>\n</RCC>\n")
	file(WRITE ${outfile} ${QRC})
endfunction()

qt_create_resource_file("${CMAKE_CURRENT_BINARY_DIR}/rc/locale.qrc" ${QM_FILES})
list(APPEND SRC_FILES "${CMAKE_CURRENT_BINARY_DIR}/rc/locale.qrc")

# This is also used in the Win32 rc file
set(RC_INFO_STRING "A lightweight anime tracker built with Qt.")

if(APPLE) # Mac OS X (or OS X (or macOS))
	set(MACOSX_BUNDLE_BUNDLE_NAME "Minori")
	set(MACOSX_BUNDLE_BUNDLE_VERSION ${minori_VERSION})
	set(MACOSX_BUNDLE_COPYRIGHT "Copyright (C) Paper 2023")
	set(MACOSX_BUNDLE_GUI_IDENTIFIER "org.eu.us.paper.minori")
	set(MACOSX_BUNDLE_INFO_STRING ${RC_INFO_STRING})
	set(MACOSX_BUNDLE_ICON_FILE rc/osx/favicon.icns)
	set(app_icon_osx "${CMAKE_CURRENT_SOURCE_DIR}/rc/osx/favicon.icns")
	set_source_files_properties(${app_icon_osx} PROPERTIES MACOSX_PACKAGE_LOCATION "Resources")

	list(APPEND SRC_FILES
		src/sys/osx/dark_theme.mm
		src/sys/osx/filesystem.mm
		${app_icon_osx}
	)
elseif(WIN32) # Windows
	configure_file(
		${CMAKE_CURRENT_SOURCE_DIR}/rc/win32/version.rc.in
		${CMAKE_CURRENT_BINARY_DIR}/rc/version.rc
		@ONLY
	)
	list(APPEND SRC_FILES
		src/sys/win32/dark_theme.cc
		rc/win32/resource.rc
		${CMAKE_CURRENT_BINARY_DIR}/rc/version.rc
	)
endif()

add_executable(minori WIN32 MACOSX_BUNDLE ${SRC_FILES})
set_property(TARGET minori PROPERTY CXX_STANDARD 11)
set_property(TARGET minori PROPERTY AUTOMOC ON)
set_property(TARGET minori PROPERTY AUTORCC ON)

target_include_directories(minori PUBLIC ${CURL_INCLUDE_DIRS} PRIVATE ${INCLUDE})
target_include_directories(minori PUBLIC ${Qt${QT_VERSION_MAJOR}Widgets_INCLUDE_DIRS})
target_compile_options(minori PRIVATE -Wall -Wpedantic -Wextra -Wsuggest-override -Wold-style-cast)
if(APPLE)
	target_compile_definitions(minori PUBLIC MACOSX)
elseif(WIN32)
	target_compile_definitions(minori PUBLIC WIN32)
endif()
target_link_libraries(minori ${LIBRARIES})
