# component2/SConscript
Import("env")
import os

with open(env["PROJECT_TOOL_S"]) as f:
    exec(f.read())


def get_opencv_from_axera():
    opencv_path = check_wget_down(
        "https://github.com/AXERA-TECH/ax-samples/releases/download/v0.1/opencv-arm-linux-gnueabihf-gcc-7.5.0.zip",
        "opencv-arm-linux-gnueabihf-gcc-7.5.0.zip",
    )
    INCLUDE = [os.path.join(opencv_path, "opencv-arm-linux/include/opencv4")]
    STATIC_LIB = AGlob(os.path.join(opencv_path, "opencv-arm-linux/lib/*.a"))
    STATIC_LIB += AGlob(
        os.path.join(opencv_path, "opencv-arm-linux/lib/opencv4/3rdparty/*.a")
    )
    return INCLUDE, STATIC_LIB


def get_opencv_from_ncnn():
    opencv_path = str(ADir("../../github_source/opencv-mobile-2.4.13.7-armlinux"))
    opencv_path = check_wget_down(
        "https://github.com/nihui/opencv-mobile/releases/download/v26/opencv-mobile-2.4.13.7-armlinux.zip",
        "opencv-mobile-2.4.13.7-armlinux.zip",
    )
    opencv_path += '/opencv-mobile-2.4.13.7-armlinux'
    gcc_dumpmachine = env["GCC_DUMPMACHINE"]
    INCLUDE = [os.path.join(opencv_path, gcc_dumpmachine, "include")]
    STATIC_LIB = AGlob(
        os.path.join(
            opencv_path,
            gcc_dumpmachine,
            "lib/*.a",
        )
    )
    return INCLUDE, STATIC_LIB


def get_grpc_from_m5stack():
    grpc_path = check_wget_down(
        "https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/linux/linux_static_packages/grpc-1.65.0-pre1.zip",
        "grpc-1.65.0-pre1.zip",
    )
    return grpc_path


if "CONFIG_STATIC_PACKAGE_ENABLED" in os.environ:
    SRCS = []
    INCLUDE = []
    PRIVATE_INCLUDE = []
    REQUIREMENTS = []
    STATIC_LIB = []
    DYNAMIC_LIB = []
    DEFINITIONS = []
    DEFINITIONS_PRIVATE = []
    LDFLAGS = []
    LINK_SEARCH_PATH = []

    if "CONFIG_OPENCV_LIB_AXERA_ENABLED" in os.environ:
        inc, slib = get_opencv_from_axera()
        INCLUDE += inc
        STATIC_LIB += slib + slib

    if "CONFIG_OPENCV_LIB_NCNN_ENABLED" in os.environ:
        inc, slib = get_opencv_from_ncnn()
        INCLUDE += inc
        STATIC_LIB += slib + slib

    if "CONFIG_GRPC_LIB_ENABLED" in os.environ:
        grpc_path = get_grpc_from_m5stack()
        gcc_dumpmachine = env["GCC_DUMPMACHINE"]
        DEFINITIONS = ["-DEFINITIONS", "-DNOMINMAX"]
        INCLUDE = [os.path.join(grpc_path, gcc_dumpmachine, "include")]
        LINK_SEARCH_PATH = [os.path.join(grpc_path, gcc_dumpmachine, "lib")]
        LDFLAGS = [
            "-l:libgrpc++.a",
            "-l:libgrpc.a",
            "-l:libgpr.a",
            "-l:libabsl_random_distributions.a",
            "-l:libabsl_random_seed_sequences.a",
            "-l:libabsl_random_internal_pool_urbg.a",
            "-l:libabsl_random_internal_randen.a",
            "-l:libabsl_random_internal_randen_hwaes.a",
            "-l:libabsl_random_internal_randen_hwaes_impl.a",
            "-l:libabsl_random_internal_randen_slow.a",
            "-l:libabsl_random_internal_platform.a",
            "-l:libabsl_random_internal_seed_material.a",
            "-l:libabsl_random_seed_gen_exception.a",
            "-l:libprotobuf.a",
            "-l:libabsl_log_internal_check_op.a",
            "-l:libabsl_leak_check.a",
            "-l:libabsl_die_if_null.a",
            "-l:libabsl_log_internal_conditions.a",
            "-l:libabsl_log_internal_message.a",
            "-l:libabsl_examine_stack.a",
            "-l:libabsl_log_internal_format.a",
            "-l:libabsl_log_internal_proto.a",
            "-l:libabsl_log_internal_nullguard.a",
            "-l:libabsl_log_internal_log_sink_set.a",
            "-l:libabsl_log_sink.a",
            "-l:libabsl_log_entry.a",
            "-l:libabsl_flags_internal.a",
            "-l:libabsl_flags_marshalling.a",
            "-l:libabsl_flags_reflection.a",
            "-l:libabsl_flags_private_handle_accessor.a",
            "-l:libabsl_flags_commandlineflag.a",
            "-l:libabsl_flags_commandlineflag_internal.a",
            "-l:libabsl_flags_config.a",
            "-l:libabsl_flags_program_name.a",
            "-l:libabsl_log_initialize.a",
            "-l:libabsl_log_globals.a",
            "-l:libabsl_vlog_config_internal.a",
            "-l:libabsl_log_internal_fnmatch.a",
            "-l:libabsl_log_internal_globals.a",
            "-l:libabsl_raw_hash_set.a",
            "-l:libabsl_hash.a",
            "-l:libabsl_city.a",
            "-l:libabsl_low_level_hash.a",
            "-l:libabsl_hashtablez_sampler.a",
            "-l:libabsl_statusor.a",
            "-l:libabsl_status.a",
            "-l:libabsl_cord.a",
            "-l:libabsl_cordz_info.a",
            "-l:libabsl_cord_internal.a",
            "-l:libabsl_cordz_functions.a",
            "-l:libabsl_exponential_biased.a",
            "-l:libabsl_cordz_handle.a",
            "-l:libabsl_crc_cord_state.a",
            "-l:libabsl_crc32c.a",
            "-l:libabsl_crc_internal.a",
            "-l:libabsl_crc_cpu_detect.a",
            "-l:libabsl_bad_optional_access.a",
            "-l:libabsl_strerror.a",
            "-l:libabsl_str_format_internal.a",
            "-l:libabsl_synchronization.a",
            "-l:libabsl_graphcycles_internal.a",
            "-l:libabsl_kernel_timeout_internal.a",
            "-l:libabsl_stacktrace.a",
            "-l:libabsl_symbolize.a",
            "-l:libabsl_debugging_internal.a",
            "-l:libabsl_demangle_internal.a",
            "-l:libabsl_malloc_internal.a",
            "-l:libabsl_time.a",
            "-l:libabsl_civil_time.a",
            "-l:libabsl_time_zone.a",
            "-l:libabsl_bad_variant_access.a",
            "-l:libutf8_validity.a",
            "-l:libutf8_range.a",
            "-l:libabsl_strings.a",
            "-l:libabsl_strings_internal.a",
            "-l:libabsl_string_view.a",
            "-l:libabsl_base.a",
            "-l:librt.a",
            "-l:libabsl_spinlock_wait.a",
            "-l:libabsl_int128.a",
            "-l:libabsl_throw_delegate.a",
            "-l:libabsl_raw_logging_internal.a",
            "-l:libabsl_log_severity.a",
            "-l:libssl.a",
            "-l:libcrypto.a",
            "-l:libre2.a",
            "-l:libgrpc_authorization_provider.a",
            "-l:libupb_message_lib.a",
            "-l:libupb_mem_lib.a",
            "-l:libcares.a",
            "-l:libaddress_sorting.a",
            "-l:libupb_json_lib.a",
            "-l:libupb_base_lib.a",
            "-l:libupb_textformat_lib.a",
            "-l:libz.a",
        ]

    env["COMPONENTS"].append(
        {
            "target": os.path.basename(env["component_dir"]),
            "SRCS": SRCS,
            "INCLUDE": INCLUDE,
            "PRIVATE_INCLUDE": PRIVATE_INCLUDE,
            "REQUIREMENTS": REQUIREMENTS,
            "STATIC_LIB": STATIC_LIB,
            "DYNAMIC_LIB": DYNAMIC_LIB,
            "DEFINITIONS": DEFINITIONS,
            "DEFINITIONS_PRIVATE": DEFINITIONS_PRIVATE,
            "LDFLAGS": LDFLAGS,
            "LINK_SEARCH_PATH": LINK_SEARCH_PATH,
            "REGISTER": "static",
        }
    )
