from SCons.Platform import TempFileMunge
from fbt.util import (
    tempfile_arg_esc_func,
    single_quote,
    wrap_tempfile,
    extract_abs_dir_path,
)

import os
import multiprocessing

Import("VAR_ENV")

forward_os_env = {
    # Import PATH from OS env - scons doesn't do that by default
    "PATH": os.environ["PATH"],
}
# Proxying CI environment to child processes & scripts
variables_to_forward = [
    # CI/CD variables
    "WORKFLOW_BRANCH_OR_TAG",
    "DIST_SUFFIX",
    "FORCE_NO_DIRTY",
    # Python & other tools
    "HOME",
    "APPDATA",
    "PYTHONHOME",
    "PYTHONNOUSERSITE",
    "TMP",
    "TEMP",
    # Colors for tools
    "TERM",
]
if proxy_env := GetOption("proxy_env"):
    variables_to_forward.extend(proxy_env.split(","))

for env_value_name in variables_to_forward:
    if environ_value := os.environ.get(env_value_name, None):
        forward_os_env[env_value_name] = environ_value


coreenv = VAR_ENV.Clone(
    tools=[
        "fbt_tweaks",
        (
            "crosscc",
            {
                "toolchain_prefix": "arm-none-eabi-",
                "versions": VAR_ENV["FBT_TOOLCHAIN_VERSIONS"],
            },
        ),
        "python3",
        "sconsmodular",
        "sconsrecursiveglob",
        "ccache",
    ],
    TEMPFILE=TempFileMunge,
    MAXLINELENGTH=2048,
    PROGSUFFIX=".elf",
    ENV=forward_os_env,
    SINGLEQUOTEFUNC=single_quote,
    ABSPATHGETTERFUNC=extract_abs_dir_path,
    # Setting up temp file parameters - to overcome command line length limits
    TEMPFILEARGESCFUNC=tempfile_arg_esc_func,
    ROOT_DIR=Dir("#"),
    FBT_SCRIPT_DIR="${ROOT_DIR}/scripts",
)

# If DIST_SUFFIX is set in environment, is has precedence (set by CI)
if os_suffix := os.environ.get("DIST_SUFFIX", None):
    coreenv.Replace(
        DIST_SUFFIX=os_suffix,
    )

# Default value for commandline options

SetOption("num_jobs", multiprocessing.cpu_count())
## NB - disabled both caches since they seem to do more harm then good in our case
# Avoiding re-scan of all sources on every startup
# SetOption("implicit_cache", True)
# SetOption("implicit_deps_unchanged", True)
# More aggressive caching
SetOption("max_drift", 1)
# Random task queue - to discover isses with build logic faster
# SetOption("random", 1)

wrap_tempfile(coreenv, "LINKCOM")
wrap_tempfile(coreenv, "ARCOM")

Return("coreenv")