import subprocess

from build.project import Project

def __cmake_compiler_args(language, compiler):
    s = compiler.split(' ', 1)
    result = []
    if len(s) == 2:
        result.append(f'-DCMAKE_{language}_COMPILER_LAUNCHER={s[0]}')
        compiler = s[1]
    result.append(f'-DCMAKE_{language}_COMPILER={compiler}')
    return result

def configure(toolchain, src, build, args=()):
    cross_args = []

    if toolchain.is_windows:
        cross_args.append('-DCMAKE_SYSTEM_NAME=Windows')
        cross_args.append('-DCMAKE_RC_COMPILER=' + toolchain.windres)

    configure = [
        'cmake',
        src,

        '-DCMAKE_INSTALL_PREFIX=' + toolchain.install_prefix,
        '-DCMAKE_BUILD_TYPE=release',
    ] + \
    __cmake_compiler_args('C', toolchain.cc) + \
    __cmake_compiler_args('CXX', toolchain.cxx) + \
    [
        '-DCMAKE_C_FLAGS=' + toolchain.cflags + ' ' + toolchain.cppflags,
        '-DCMAKE_CXX_FLAGS=' + toolchain.cxxflags + ' ' + toolchain.cppflags,

        '-GNinja',
    ] + cross_args + args

    subprocess.check_call(configure, env=toolchain.env, cwd=build)

class CmakeProject(Project):
    def __init__(self, url, md5, installed, configure_args=[],
                 windows_configure_args=[],
                 **kwargs):
        Project.__init__(self, url, md5, installed, **kwargs)
        self.configure_args = configure_args
        self.windows_configure_args = windows_configure_args

    def configure(self, toolchain):
        src = self.unpack(toolchain)
        build = self.make_build_path(toolchain)
        configure_args = self.configure_args
        if toolchain.is_windows:
            configure_args = configure_args + self.windows_configure_args
        configure(toolchain, src, build, configure_args)
        return build

    def build(self, toolchain):
        build = self.configure(toolchain)
        subprocess.check_call(['ninja', 'install'],
                              cwd=build, env=toolchain.env)