from conan import ConanFile
from conan.tools import files
from conan.tools.cmake import CMakeDeps, CMakeToolchain, CMake
from conan.tools.microsoft import MSBuildDeps, MSBuild
import yaml
import re
from os import path


class TdmDepends(ConanFile):
    name = "thedarkmod"
    settings = "os", "compiler", "build_type", "arch"
    options = {
        "build_game": [False, True],
        "build_game_vcxproj": [False, True],
        "build_installer": [False, True],
        "build_packager": [False, True],
    }
    default_options = {
        "build_game": False,
        "build_game_vcxproj": False,
        "build_installer": False,
        "build_packager": False,
    }

    def layout(self):
        self.folders.root = ".."
        self.folders.source = "."

    def set_requirements(self, do_require):
        with open("packages.yml", "r") as f:
            doc = yaml.safe_load(f)

        for dep in doc["packages"]:
            pkgname = dep["name"]

            # ignore os-specific packages if os does not match
            if "os" in dep and str(self.settings.os) not in dep["os"]:
                continue

            if do_require:
                ref = dep["name"] + '/' + dep["version"]
                if dep["local"]:
                    ref += "@thedarkmod"
                # force flag allows to resolve version conflicts
                self.requires(ref, force = True)

            else:
                # pass package options from yaml
                options = doc["options"].get(pkgname, {})
                for k,v in options.items():
                    print("OPT %s = %s on %s" % (k, v, pkgname))
                    setattr(self.options[pkgname], k, v)

    def requirements(self):
        self.set_requirements(True)
    def configure(self):
        self.set_requirements(False)

    def generate(self):
        # cmake can be used on all platforms
        cmake = CMakeDeps(self)
        # don't forget to pass -s thedarkmod/*:build_type=XXX to select which TDM config to generate deps for
        cmake.configuration = str(self.settings.build_type)
        cmake.generate()

        # for building with MSVC project directly (Windows only)
        if self.settings.compiler == 'msvc':
            assert str(self.settings.build_type) == str(self.settings.compiler.runtime_type), "Forgot to set -s thedarkmod/*:build_type=XXX ?"
            if self.settings.build_type == 'Debug':
                configs = ['Debug', 'Debug Editable']
            else:
                configs = ['Release', 'Debug Fast', 'Sanitize']
            for cfg in configs:
                msbuild = MSBuildDeps(self)
                msbuild.configuration = cfg
                msbuild.generate()

    # note: conan build is an optional step
    # for normal builds, better use cmake or MSVC directly
    def build(self):
        suffix = ''
        if self.settings.compiler != "msvc":
            suffix += '_%s' % str(self.settings.build_type)
        suffix = re.escape(suffix).lower()

        if self.options.build_game:
            self.folders.build = "build_game" + suffix
            tc = CMakeToolchain(self)
            tc.generate()
            cmake = CMake(self)
            variables = {
                'TDM_THIRDPARTY_ARTEFACTS': 'OFF',
                'COPY_EXE': 'OFF'
            }
            cmake.configure(build_script_folder = '.', variables = variables)
            cmake.build()

        if self.options.build_installer:
            self.folders.build = "build_installer" + suffix
            tc = CMakeToolchain(self)
            tc.generate()
            cmake = CMake(self)
            variables = {
                'TDM_THIRDPARTY_ARTEFACTS': 'OFF',
            }
            cmake.configure(build_script_folder = 'tdm_installer', variables = variables)
            cmake.build()

        if self.options.build_packager:
            self.folders.build = "build_packager" + suffix
            tc = CMakeToolchain(self)
            tc.generate()
            cmake = CMake(self)
            variables = {
                'TDM_THIRDPARTY_ARTEFACTS': 'OFF',
            }
            cmake.configure(build_script_folder = 'tdm_package', variables = variables)
            cmake.build()

        if self.options.build_game_vcxproj:
            self.folders.build = "ignored"
            msbuild = MSBuild(self)
            msbuild.platform = {'x86': 'Win32', 'x86_64': 'x64'}[str(self.settings.arch)]
            msbuild.build(path.abspath(path.join(self.recipe_folder, "..", "TheDarkMod.sln")))
