from conan import ConanFile
from conan.tools.files import copy
from conan.tools.cmake import CMakeToolchain
from os import path


class Chatterino(ConanFile):
    name = "Chatterino"
    settings = "os", "compiler", "build_type", "arch"
    default_options = {
        "with_benchmark": False,
        "with_openssl3": True,
        "openssl*:shared": True,
        "boost*:header_only": True,
        "hunspell*:shared": False,
    }
    options = {
        "with_benchmark": [True, False],
        # Qt is built with OpenSSL 3 from version 6.5.0 onwards
        "with_openssl3": [True, False],
    }
    generators = "CMakeDeps"

    def requirements(self):
        self.requires("boost/1.90.0")

        if self.settings.os != "Windows":
            return

        self.requires("libavif/1.3.0")
        if self.options.get_safe("with_benchmark", False):
            self.requires("benchmark/1.9.0")

        self.requires("openssl/3.6.1")
        self.requires("hunspell/1.7.2")

    def generate(self):
        tc = CMakeToolchain(self)
        tc.blocks.remove("compilers")
        tc.blocks.remove("cmake_flags_init")
        tc.blocks.remove("cppstd")
        tc.blocks.remove("libcxx")
        tc.blocks.remove("generic_system")
        tc.blocks.remove("user_toolchain")
        tc.blocks.remove("output_dirs")
        tc.blocks.remove("apple_system")
        tc.user_presets_path = False
        tc.generate()

        def copy_bin(dep, selector, subdir):
            src = path.realpath(dep.cpp_info.bindirs[0])
            dst = path.realpath(path.join(self.build_folder, subdir))

            if src == dst:
                return

            copy(self, selector, src, dst, keep_path=False)

        for dep in self.dependencies.values():
            # macOS
            copy_bin(dep, "*.dylib", "bin")
            # Windows
            copy_bin(dep, "*.dll", "bin")
            copy_bin(dep, "*.dll", "Chatterino2")  # used in CI
            # Linux
            copy(
                self,
                "*.so*",
                dep.cpp_info.libdirs[0],
                path.join(self.build_folder, "bin"),
                keep_path=False,
            )
