# Copyright 2020 The IREE Authors
#
# Licensed under the Apache License v2.0 with LLVM Exceptions.
# See https://llvm.org/LICENSE.txt for license information.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception

import bazel_to_cmake_converter
import bazel_to_cmake_targets

DEFAULT_ROOT_DIRS = ["compiler", "runtime", "samples", "tests", "tools"]

REPO_MAP = {
    # Since this is the @iree_core repo, map to empty since all internal
    # targets are of the form "//compiler", not "@iree_core//compiler".
    "@iree_core": "",
}


class CustomBuildFileFunctions(bazel_to_cmake_converter.BuildFileFunctions):
    def iree_compiler_cc_library(self, deps=[], **kwargs):
        self.cc_library(deps=deps + ["//compiler/src:defs"], **kwargs)

    def iree_runtime_cc_library(self, deps=[], **kwargs):
        self.cc_library(deps=deps + ["//runtime/src:runtime_defines"], **kwargs)

    def iree_runtime_wasm_cc_library(self, **kwargs):
        self.wasm_cc_library(**kwargs)

    def iree_runtime_wasm_entry(self, **kwargs):
        self.wasm_entry(**kwargs)

    def iree_runtime_wasm_cc_binary(self, deps=[], **kwargs):
        self.wasm_cc_binary(deps=deps + ["//runtime/src:runtime_defines"], **kwargs)

    def iree_runtime_wasm_cc_test(self, deps=[], **kwargs):
        self.wasm_cc_test(deps=deps + ["//runtime/src:runtime_defines"], **kwargs)

    def iree_runtime_cc_test(self, deps=[], resource_group=None, **kwargs):
        # Extract resource_group from tags if provided via the .bzl macro.
        tags = kwargs.get("tags", [])
        if not resource_group and tags:
            for tag in tags:
                if tag.startswith("resource_group:"):
                    resource_group = tag[len("resource_group:") :]
                    break
        self.cc_test(
            deps=deps + ["//runtime/src:runtime_defines"],
            resource_group=resource_group,
            **kwargs,
        )

    def iree_compiler_cc_test(self, deps=[], **kwargs):
        self.cc_test(deps=deps + ["//compiler/src:defs"], **kwargs)

    def iree_runtime_cc_binary(self, deps=[], **kwargs):
        self.cc_binary(deps=deps + ["//runtime/src:runtime_defines"], **kwargs)

    def iree_compiler_cc_binary(self, deps=[], **kwargs):
        self.cc_binary(deps=deps + ["//compiler/src:defs"], **kwargs)


class CustomTargetConverter(bazel_to_cmake_targets.TargetConverter):
    def _initialize(self):
        self._update_target_mappings(
            {
                "//compiler/src:defs": [],
                "//runtime/src:runtime_defines": [],
            }
        )

    def _convert_unmatched_target(self, target: str) -> str:
        """Converts unmatched targets in a repo specific way."""
        # Default rewrite: prefix with "iree::", without pruning the path.
        return ["iree::" + self._convert_to_cmake_path(target)]
