# Copyright (c) 2021 Huawei Device Co., Ltd.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import("//build/config/components/sdk/interface.gni")
import("//build/ohos.gni")
import("//build/ohos/ace/ace.gni")
import("//build/ohos_var.gni")
if (!defined(is_arkui_x) || !is_arkui_x) {
  import("//build/templates/bpf/ohos_bpf_config.gni")
}
import("//build/templates/cxx/prebuilt.gni")

ets_loader_lib_dir =
    get_label_info(":build_ets_loader_library", "target_out_dir") + "/lib"
ets_loader_declarations_dir = get_label_info(":build_ets_loader_library",
                                             "target_out_dir") + "/declarations"
ets_loader_component_config_file =
    get_label_info(":build_ets_loader_library", "target_out_dir") +
    "/component_config.json"
ets_loader_form_config_file =
    get_label_info(":build_ets_loader_library", "target_out_dir") +
    "/form_config.json"
ets_loader_build_config_file =
    get_label_info(":build_ets_loader_library", "target_out_dir") +
    "/build_config.json"
ets_sysResource = get_label_info(":build_ets_sysResource", "target_out_dir") +
                  "/sysResource.js"
ets_loader_kit_configs_dir = get_label_info(":build_ets_loader_library",
                                            "target_out_dir") + "/kit_configs"
ets_component_dep = "sdk:ets_component"
if (defined(is_arkui_x) && is_arkui_x) {
  ets_component_dep = "//interface/sdk-js:ets_component"
}
ets_component_out_dir = get_label_info(ets_component_dep, "target_out_dir")

action("build_ets_loader_library") {
  deps = [
    ":components",
    ":form_components",
    ":insight_intents",
    ":install_arkguard_tsc_declgen",
    ":server",
  ]
  if (defined(is_arkui_x) && is_arkui_x) {
    deps += [
      "//interface/sdk-js:bundle_arkts",
      "//interface/sdk-js:bundle_kits",
      "//interface/sdk-js:ohos_build_dynamic_sdk_component",
      "//interface/sdk-js:ets_internal_api",
      "//interface/sdk-js:ohos_declaration_ets",
    ]  
  } else {
    external_deps = [
      "sdk:bundle_arkts_etc",
      "sdk:bundle_kits_etc",
      "sdk:ets_component_etc",
      "sdk:ets_internal_api_etc",
      "sdk:ohos_declaration_ets_api",
    ]
  }
  script = "build_ets_loader_library.py"
  depfile = "$target_gen_dir/$target_name.d"
  outputs = [
    ets_loader_lib_dir,
    ets_loader_declarations_dir,
    ets_loader_component_config_file,
    ets_loader_form_config_file,
    ets_loader_kit_configs_dir,
    ets_loader_build_config_file,
  ]

  _ets_loader_dir = "compiler"
  if (is_standard_system) {
    _ace_config_dir = "compiler"
  } else {
    _ace_config_dir = "//prebuilts/ace-toolkit/ets-loader/compiler"
  }
  _declarations_file_dir =
      ets_component_out_dir + "/ohos_build_dynamic_sdk_component"
  _kit_configs_file_dir = ets_component_out_dir + "/bundle_kits"
  _kit_apis_file_dir = root_out_dir + "/ohos_declaration/ohos_declaration_ets"
  _arkts_apis_file_dir = ets_component_out_dir + "/bundle_arkts"

  _babel_js = _ace_config_dir + "/node_modules/@babel/cli/bin/babel.js"
  _babel_config_js = _ace_config_dir + "/babel.config.js"
  _uglify_source_js = _ace_config_dir + "/uglify-source.js"
  _copy_json_files_js = _ace_config_dir + "/copy_json_files.js"
  _build_declarations_file_js = _ace_config_dir + "/build_declarations_file.js"
  _build_kit_configs_file_js = _ace_config_dir + "/build_kitConfigs_file.js"

  inputs = [
    _babel_config_js,
    _babel_js,
    _uglify_source_js,
    _copy_json_files_js,
    _build_declarations_file_js,
    _build_kit_configs_file_js,
  ]

  nodejs_path = "//prebuilts/build-tools/common/nodejs/current/bin/node"

  args = [
    "--depfile",
    rebase_path(depfile, root_build_dir),
    "--node",
    rebase_path(nodejs_path, root_build_dir),
    "--babel-js",
    rebase_path(_babel_js, root_build_dir),
    "--ets-loader-src-dir",
    rebase_path(_ets_loader_dir + "/src", root_build_dir),
    "--babel-config-js",
    rebase_path(_babel_config_js, root_build_dir),
    "--uglify-source-js",
    rebase_path(_uglify_source_js, root_build_dir),
    "--output-dir",
    rebase_path(ets_loader_lib_dir, root_build_dir),
    "--copy-json-files-js",
    rebase_path(_copy_json_files_js, root_build_dir),
    "--copy-src-dir",
    rebase_path(_ets_loader_dir + "/src", root_build_dir),
    "--copy-dest-dir",
    rebase_path(ets_loader_lib_dir, root_build_dir),
    "--declarations-file-dir",
    rebase_path(_declarations_file_dir, root_build_dir),
    "--build-declarations-file-js",
    rebase_path(_build_declarations_file_js, root_build_dir),
    "--output-declarations-dir",
    rebase_path(ets_loader_declarations_dir, root_build_dir),
    "--output-component-config-file",
    rebase_path(ets_loader_component_config_file, root_build_dir),
    "--output-form-config-file",
    rebase_path(ets_loader_form_config_file, root_build_dir),
    "--output-build-config-file",
    rebase_path(ets_loader_build_config_file, root_build_dir),
    "--kit-configs-file-dir",
    rebase_path(_kit_configs_file_dir, root_build_dir),
    "--build-kit-configs-file-js",
    rebase_path(_build_kit_configs_file_js, root_build_dir),
    "--output-kit-configs-dir",
    rebase_path(ets_loader_kit_configs_dir, root_build_dir),
    "--kit-apis-file-dir",
    rebase_path(_kit_apis_file_dir, root_build_dir),
    "--arkts-apis-file-dir",
    rebase_path(_arkts_apis_file_dir, root_build_dir),
    "--build-public-sdk",
    "${sdk_build_public}",
    "--sdk-build-arkts",
    "${sdk_build_arkts}",
  ]
}

action("build_ets_sysResource") {
  if (is_standard_system) {
    script = "//developtools/ace_ets2bundle/generateSysResource.py"
  } else {
    script = "//foundation/ace/huawei_proprietary/tools/ets-loader/generateSysResource.py"
  }
  outputs = [ ets_sysResource ]

  _id_defined_json = "//base/global/system_resources/systemres/main/resources/base/element/id_defined.json"
  inputs = [ _id_defined_json ]

  args = [
    "--input-json",
    rebase_path(_id_defined_json, root_build_dir),
    "--output-js",
    rebase_path(ets_sysResource, root_build_dir),
  ]
}

ets_loader_sources = [
  "compiler/compile_plugin.js",
  "compiler/config/obfuscateWhiteList.json5",
  "compiler/main.js",
  "compiler/node_modules",
  "compiler/npm-install.js",
  "compiler/package-lock.json",
  "compiler/package.json",
  "compiler/rollup.config.js",
  "compiler/tsconfig.esm.json",
  "compiler/tsconfig.json",
  "compiler/webpack.config.js",
  "compiler/config/stmgmtWhiteList.json",
]

ohos_copy("ets_loader") {
  deps = [
    ":build_ets_loader_library",
    ":install_arkguard_tsc_declgen",
  ]
  sources = ets_loader_sources
  deps += [ ":build_ets_sysResource" ]
  sources += [ ets_sysResource ]

  outputs = [ target_out_dir + "/$target_name/{{source_file_part}}" ]
  module_source_dir = target_out_dir + "/$target_name"
  module_install_name = ""
}

ohos_copy("ets_loader_component_config") {
  deps = [ ":build_ets_loader_library" ]
  sources = [
    ets_loader_build_config_file,
    ets_loader_component_config_file,
  ]

  outputs = [ target_out_dir + "/$target_name/{{source_file_part}}" ]
  module_source_dir = target_out_dir + "/$target_name"
  module_install_name = ""
}

ohos_copy("ets_loader_form_config") {
  deps = [ ":build_ets_loader_library" ]
  sources = [ ets_loader_form_config_file ]

  outputs = [ target_out_dir + "/$target_name/{{source_file_part}}" ]
  module_source_dir = target_out_dir + "/$target_name"
  module_install_name = ""
}

ohos_copy("ets_loader_library") {
  deps = [ ":build_ets_loader_library" ]
  sources = [ ets_loader_lib_dir ]
  outputs = [ target_out_dir + "/$target_name" ]
  module_source_dir = target_out_dir + "/$target_name"
  module_install_name = ""
}

ohos_copy("ets_loader_kit_configs") {
  deps = [ ":build_ets_loader_library" ]
  sources = [ ets_loader_kit_configs_dir ]
  outputs = [ target_out_dir + "/$target_name" ]
  module_source_dir = target_out_dir + "/$target_name"
  module_install_name = ""
}

ohos_copy("components") {
  sources = [ "compiler/components" ]
  outputs = [ target_out_dir + "/$target_name" ]
  module_source_dir = target_out_dir + "/$target_name"
  module_install_name = ""
}

ohos_copy("form_components") {
  sources = [ "compiler/form_components" ]
  outputs = [ target_out_dir + "/$target_name" ]
  module_source_dir = target_out_dir + "/$target_name"
  module_install_name = ""
}

ohos_copy("insight_intents") {
  sources = [ "compiler/insight_intents" ]
  outputs = [ target_out_dir + "/$target_name" ]
  module_source_dir = target_out_dir + "/$target_name"
  module_install_name = ""
}

ohos_copy("server") {
  sources = [ "compiler/server" ]
  outputs = [ target_out_dir + "/$target_name" ]
  module_source_dir = target_out_dir + "/$target_name"
  module_install_name = ""
}

ohos_copy("codegen") {
  sources = [ "compiler/codegen" ]
  outputs = [ target_out_dir + "/$target_name" ]
  module_source_dir = target_out_dir + "/$target_name"
  module_install_name = ""
}

ohos_copy("ets_loader_declaration") {
  deps = [ ":build_ets_loader_library" ]
  sources = [ ets_loader_declarations_dir ]
  outputs = [ target_out_dir + "/$target_name" ]
  module_source_dir = target_out_dir + "/$target_name"
  module_install_name = ""
}

ohos_copy("ets_loader_ark") {
  deps = [
    ":build_ets_loader_library",
    ":install_arkguard_tsc_declgen",
  ]
  sources = ets_loader_sources
  deps += [ ":build_ets_sysResource" ]
  sources += [ ets_sysResource ]
  outputs = [ target_out_dir + "/$target_name/{{source_file_part}}" ]
}

ohos_copy("ets_loader_ark_lib") {
  deps = [
    ":build_ets_loader_library",
    ":ets_loader_ark",
  ]
  sources = [ ets_loader_lib_dir ]
  outputs = [ target_out_dir + "/ets_loader_ark/lib" ]
}

ohos_copy("ets_loader_ark_declaration") {
  deps = [
    ":build_ets_loader_library",
    ":ets_loader_ark",
  ]
  sources = [ ets_loader_declarations_dir ]
  outputs = [ target_out_dir + "/ets_loader_ark/declarations" ]
}

ohos_copy("ets_loader_ark_components") {
  deps = [
    ":build_ets_loader_library",
    ":ets_loader_ark",
  ]
  sources = [ "compiler/components" ]
  outputs = [ target_out_dir + "/ets_loader_ark/components" ]
}

ohos_copy("ets_loader_ark_form_components") {
  deps = [
    ":build_ets_loader_library",
    ":ets_loader_ark",
  ]
  sources = [ "compiler/form_components" ]
  outputs = [ target_out_dir + "/ets_loader_ark/form_components" ]
}

ohos_copy("ets_loader_ark_insight_intents") {
  deps = [
    ":build_ets_loader_library",
    ":ets_loader_ark",
  ]
  sources = [ "compiler/insight_intents" ]
  outputs = [ target_out_dir + "/ets_loader_ark/insight_intents" ]
}

ohos_copy("ets_loader_ark_server") {
  deps = [
    ":build_ets_loader_library",
    ":ets_loader_ark",
  ]
  sources = [ "compiler/server" ]
  outputs = [ target_out_dir + "/ets_loader_ark/server" ]
}

ohos_copy("ets_loader_ark_codegen") {
  deps = [
    ":build_ets_loader_library",
    ":ets_loader_ark",
  ]
  sources = [ "compiler/codegen" ]
  outputs = [ target_out_dir + "/ets_loader_ark/codegen" ]
}

ohos_prebuilt_etc("ets_loader_ark_hap") {
  source = "OAT.xml"
  deps = [ ":ets_loader_ark_hap_inner" ]
  install_enable = false
  part_name = "ace_ets2bundle"
  subsystem_name = "developtools"
}

ohos_copy("ohos_declaration_ets_ark") {
  if (defined(is_arkui_x) && is_arkui_x) {
    deps = [ "//interface/sdk-js:ohos_declaration_ets" ]
    sources = [ root_out_dir + "/ohos_declaration/ohos_declaration_ets" ]
  } else {
    external_deps = [ "sdk:ohos_declaration_ets_api" ]
    ets_ark_path = get_label_info("sdk:ohos_declaration_ets_api",
                                "target_out_dir") + "/../api"
    sources = [ ets_ark_path ]
  }
  outputs = [ target_out_dir + "/../api" ]
}

group("ets_loader_ark_hap_inner") {
  deps = [
    ":ets_loader_ark",
    ":ets_loader_ark_codegen",
    ":ets_loader_ark_components",
    ":ets_loader_ark_declaration",
    ":ets_loader_ark_form_components",
    ":ets_loader_ark_insight_intents",
    ":ets_loader_ark_lib",
    ":ets_loader_ark_server",
    ":ohos_declaration_ets_ark",
  ]
}

typescript_dir = get_label_info("//third_party/typescript:build_typescript",
                                "target_out_dir")

action("install_arkguard_tsc_declgen") {
  external_deps = [
    "ets_frontend:build_arkguard_etc",
    "runtime_core:build_declgen_etc",
    "typescript:build_typescript_etc",
  ]
  script = "install_arkguard_tsc_declgen.py"
  args = [
    rebase_path("${typescript_dir}/ohos-typescript-4.9.5-r4.tgz"),
    rebase_path(
        "${root_out_dir}/obj/arkcompiler/ets_frontend/arkguard/build_arkguard/arkguard-1.1.3.tgz"),
    rebase_path("//developtools/ace_ets2bundle/compiler"),
    current_os,
    rebase_path(
        "${root_out_dir}/obj/arkcompiler/runtime_core/static_core/plugins/ets/tools/declgen_ts2sts/panda-declgen-1.0.0.tgz"),
  ]
  outputs = [ "${target_out_dir}/${target_name}.stamp" ]
}