# Copyright 2026 Gentoo Authors
# Distributed under the terms of the BSD 3-Claude License

EAPI=8

DISTUTILS_USE_PEP517=no
DISTUTILS_SINGLE_IMPL=1
PYTHON_COMPAT=( python3_{12..15} )

inherit distutils-r1 gnome2-utils meson optfeature xdg

DESCRIPTION="Run Windows software and games on Linux"
HOMEPAGE="
	https://usebottles.com
	https://github.com/bottlesdevs/Bottles
"
SRC_URI="https://github.com/bottlesdevs/Bottles/archive/refs/tags/${PV}.tar.gz -> ${P}.tar.gz"

S="${WORKDIR}/Bottles-${PV}"

LICENSE="GPL-3"
SLOT="0"
KEYWORDS="~amd64"

RDEPEND="
	dev-libs/glib:2
	dev-libs/libportal[gtk]
	gui-libs/gtk:4
	gui-libs/gtksourceview:5
	gui-libs/libadwaita:1

	dev-vcs/fvs2

	$(python_gen_cond_dep '
		app-arch/patool[${PYTHON_USEDEP}]
		dev-python/certifi[${PYTHON_USEDEP}]
		dev-python/chardet[${PYTHON_USEDEP}]
		dev-python/charset-normalizer[${PYTHON_USEDEP}]
		dev-python/icoextract[${PYTHON_USEDEP}]
		dev-python/idna[${PYTHON_USEDEP}]
		dev-python/markdown[${PYTHON_USEDEP}]
		dev-python/orjson[${PYTHON_USEDEP}]
		dev-python/pathvalidate[${PYTHON_USEDEP}]
		dev-python/pefile[${PYTHON_USEDEP}]
		dev-python/pycairo[${PYTHON_USEDEP}]
		dev-python/pycurl[${PYTHON_USEDEP}]
		dev-python/pygobject[${PYTHON_USEDEP}]
		dev-python/pyxdg[${PYTHON_USEDEP}]
		dev-python/pyyaml[${PYTHON_USEDEP}]
		dev-python/requests[${PYTHON_USEDEP}]
		dev-python/urllib3[${PYTHON_USEDEP}]
		dev-python/wheel[${PYTHON_USEDEP}]
		dev-python/yara-python[${PYTHON_USEDEP}]
		media-gfx/vkbasalt-cli[${PYTHON_USEDEP}]
	')
"
DEPEND="${RDEPEND}"
BDEPEND="
	dev-libs/appstream-glib
	dev-libs/glib:2
	dev-util/blueprint-compiler
	dev-util/desktop-file-utils
	dev-util/gtk-update-icon-cache
	sys-devel/gettext

	test? (
		$(python_gen_cond_dep '
			dev-python/freezegun[${PYTHON_USEDEP}]
		')
	)
"

EPYTEST_DESELECT=(
	bottles/tests/backend/integration/playtime/test_disabled_tracking.py::test_disabled_tracking_smoke
	bottles/tests/backend/integration/playtime/test_wine_executor_playtime.py::test_wine_executor_emits_and_updates_totals
	bottles/tests/backend/manager/test_manager.py::test_manager_cli_skips_connection_check
	bottles/tests/backend/manager/test_playtime.py::test_disable_tracking_method
	bottles/tests/backend/manager/test_playtime.py::test_disabled_tracker_is_noop
	bottles/tests/backend/manager/test_sandbox_creation.py::test_create_bottle_rejects_profile_link_outside_prefix
	bottles/tests/backend/test_network_timeouts.py::test_default_repository_fallbacks_are_commit_pinned
	bottles/tests/backend/wine/test_executor.py::test_run_program_substitutes_placeholders
	bottles/tests/frontend/test_cli_setup.py::test_list_components_prepares_directories
	bottles/tests/frontend/test_cli_setup.py::test_new_bottle_reports_creation_failure
	bottles/tests/frontend/test_cli_setup.py::test_new_bottle_waits_for_catalogs_before_installing
	bottles/tests/frontend/test_common.py::test_runner_dropdown_uses_display_names_without_changing_ids
	bottles/tests/frontend/test_dependency_entry.py::test_cache_lookup_is_skipped_without_installed_dependencies
	bottles/tests/frontend/test_dependency_entry.py::test_cache_lookup_only_runs_offline
	bottles/tests/frontend/test_dependency_entry.py::test_installed_dependency_row_shows_its_name
	bottles/tests/frontend/test_details_view.py::test_unload_view_empties_the_page_stack
	bottles/tests/frontend/test_drive_dialog.py::test_device_drive_shows_eject_action
	bottles/tests/frontend/test_external_runner_component.py::test_external_runner_cannot_be_removed_from_bottles
	bottles/tests/frontend/test_gtk_utils.py::test_full_width_string_list_factory_uses_unellipsized_labels
	bottles/tests/frontend/test_steam_library.py::test_program_widget_switches_desktop_entry_action
	bottles/tests/frontend/test_steam_library.py::test_program_widget_uses_library_icon
	bottles/tests/frontend/test_steam_library.py::test_steam_library_widget_launches_through_steam
	bottles/tests/frontend/test_steam_library.py::test_steam_program_widget_exposes_library_action
	bottles/tests/frontend/test_steam_runtime.py::test_steam_runtime_row_explains_availability
	bottles/tests/frontend/test_ui_language.py::test_ui_languages_match_shipped_catalogs
)

EPYTEST_IGNORE=(
	bottles/tests/frontend/test_open_uri.py
	bottles/tests/fvs/test_repo.py
)

EPYTEST_PLUGINS=( pytest-mock )
distutils_enable_tests pytest

src_prepare() {
	default

	sed -i "s|fs.is_file('/' + '.flatpak-info')|fs.is_file(meson.current_source_dir() / 'meson.build')|" \
		bottles/frontend/meson.build || die
	sed -i '/^import os$/a os.environ.setdefault("CPAK_CONTAINER_ID", "1")' \
		bottles/frontend/bottles.py bottles/frontend/cli/cli.py || die
	sed -i 's|return "FLATPAK_ID" in os.environ or is_cpak()|return False|' \
		bottles/backend/globals.py || die

	sed -i -E 's/\.resolve\(strict=(True|False)\)//g' \
		bottles/backend/umu/provider.py || die
}

src_test() {
	find bottles/tests -type f -exec \
		sed -i "s|/app/share/bottles/bottles.gresource|${BUILD_DIR}/bottles/frontend/ui/bottles.gresource|" {} \;

	meson_src_test
	distutils-r1_src_test
}

src_install() {
	meson_src_install

	python_fix_shebang "${ED}/usr/bin"
}

pkg_postinst() {
	xdg_pkg_postinst
	gnome2_schemas_update

	optfeature "extracting files from .cab files" app-arch/cabextract
	optfeature "7-Zip archiver support" app-arch/p7zip
	optfeature "Vulkan support" dev-util/vulkan-tools
	optfeature "icon/image convertion" media-gfx/imagemagick
	optfeature "display information support" x11-apps/xdpyinfo

	optfeature "preloading game files into memory" dev-util/vmtouch
	optfeature "optimizing Linux system performance on demand" games-util/gamemode
	optfeature "an efficient micro-compositor for running games" gui-wm/gamescope
	optfeature "monitoring FPS, temperatures, CPU/GPU load and more" games-util/mangohud
}

pkg_postrm() {
	xdg_pkg_postrm
	gnome2_schemas_update
}