from waflib import Logs
from waflib import Options


def configure(conf):
    conf.load("python")
    conf.check_python_version((3, 0, 0))

    Logs.info("Will use msbuild to compile")
    conf.find_program("msbuild", path_list=conf.env.PATH, var="MSBUILD")
    conf.env.MSBUILD = '\"%s\"' % (conf.env.MSBUILD,)

    if conf.options.mode not in ("debug", "release", "release_msvc"):
        conf.fatal("--mode must be either debug, release or release_msvc.")

    conf.env.BUILD_CONFIGURATION = conf.options.mode
    if conf.env.DEST_CPU == "x86":
        conf.env.TARGET_PLATFORM = "Win32"
    elif conf.env.DEST_CPU == "amd64":
        conf.env.TARGET_PLATFORM = "x64"
    else:
        conf.fatal("Unsupported target CPU: " + conf.env.DEST_CPU)

    conf.msg("Target platform", conf.env.TARGET_PLATFORM)

    conf.env.ENABLE_TEST = conf.options.test
    conf.msg_feature("Tests", conf.env.ENABLE_TEST)
    conf.env.ENABLE_AVISYNTH = conf.options.avisynth
    conf.msg_feature("Avisynth support", conf.env.ENABLE_AVISYNTH)


def build(bld):
    Options.options.jobs = 1 # Don't run multiple jobs at the same time
    int_dir = bld.path.get_bld().make_node(r"tmp")
    final_output_dir = bld.path.get_bld().parent
    bld.env.INTDIR = int_dir.abspath()
    libs = [("SHARED", "DynamicLibrary", ".dll"),
            ("STATIC", "StaticLibrary", ".lib")]
    bld.env.DISABLE_VAPOURSYNTH = str(not bld.env.ENABLE_VAPOURSYNTH).lower()
    bld.env.DISABLE_AVISYNTH = str(not bld.env.ENABLE_AVISYNTH).lower()
    for var, type, ext in libs:
        if not bld.env[var]:
            continue

        output_name = bld.env.APPNAME + ext
        int_output_dir = int_dir.find_or_declare(var.lower())
        int_output = int_output_dir.find_or_declare(output_name)
        msbuild_params = (
            r"/t:Build "
            r"/p:OutDir=" + int_output_dir.abspath() + r"\ "
            r"/p:Configuration=${BUILD_CONFIGURATION} "
            r"/p:Platform=${TARGET_PLATFORM} "
            r"/p:DisableVapoursynth=${DISABLE_VAPOURSYNTH} "
            r"/p:DisableAvisynth=${DISABLE_AVISYNTH} "
            r"/p:BuildProjectReferences=false "
            r"/p:DisableProjectReferences=true "
        )
        bld(
            rule=(
                "${MSBUILD} ${SRC[0].abspath()} "
                r"/p:TargetName=${APPNAME} "
                r"/p:IntDir=${INTDIR}\obj\ "
                r"/p:ConfigurationType=" + type + " "
                + msbuild_params
            ),
            source=bld.path.find_resource("flash3kyuu_deband.vcxproj"),
            target=int_output,
            always=True,
            update_outputs=True,
        )
        bld(
            rule="copy \"${SRC}\" \"${TGT}\"",
            source=int_output,
            target=final_output_dir.find_or_declare(output_name),
        )

    if bld.env.ENABLE_TEST:
        test_output_name = bld.env.APPNAME + "-test.exe"
        test_int_output = int_output_dir.find_or_declare(test_output_name)
        bld(
            rule=(
                "${MSBUILD} ${SRC[0].abspath()} "
                r"/p:TargetName=${APPNAME}-test "
                r"/p:IntDir=${INTDIR}\obj\test\ "
                r"/p:AdditionalDependencies=${APPNAME}.lib "
                + ("/p:StaticF3kdb=true " if type == "StaticLibrary" else "")
                + msbuild_params
            ),
            source=[
                bld.path.find_resource("f3kdb_test.vcxproj"),
                int_output,
            ],
            target=test_int_output,
            always=True,
            update_outputs=True,
        )
        bld(
            rule="copy \"${SRC}\" \"${TGT}\"",
            source=test_int_output,
            target=final_output_dir.find_or_declare(test_output_name),
        )

