"""
 Copyright 2018-present Open Networking Foundation

 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.
"""

load("//tools/build/bazel:generate_workspace.bzl", "CORE_DEPS", "ONOS_YANG")
load("//tools/build/bazel:osgi_java_library.bzl", "osgi_jar")
load("//tools/build/bazel:onos_app.bzl", "onos_app")
load(
    "//tools/build/bazel:variables.bzl",
    "APP_PREFIX",
    "DEFAULT_APP_CATEGORY",
    "ONOS_ARTIFACT_BASE",
    "ONOS_GROUP_ID",
    "ONOS_ORIGIN",
    "ONOS_VERSION",
)

REGISTRATOR = \
    "// Auto-generated code\n" + \
    "package org.onosproject.model.registrator.impl;\n" + \
    "\n" + \
    "import org.onosproject.yang.AbstractYangModelRegistrator;\n" + \
    "import org.apache.felix.scr.annotations.Component;\n" + \
    "\n" + \
    "@Component(immediate = true)\n" + \
    "public class YangModelRegistrator extends AbstractYangModelRegistrator {\n" + \
    "    public YangModelRegistrator() {\n" + \
    "        super(YangModelRegistrator.class);\n" + \
    "    }\n" + \
    "}"

REGISTRATOR_FILE = "src/org/onosproject/model/registrator/impl/YangModelRegistrator.java"

# Implementation of the YANG library rule
def _yang_library_impl(ctx):
    generated_sources = ctx.actions.declare_directory("generated-sources")

    arguments = [
        ctx.attr.model_id,
        generated_sources.path,
    ]
    inputs = []

    for dep in ctx.files.deps:
        arguments += ["-d", dep.path]
        inputs += [dep]

    for source in ctx.files.srcs:
        arguments += [source.path]
        inputs += [source]

    ctx.actions.run(
        inputs = inputs,
        outputs = [generated_sources],
        arguments = arguments,
        progress_message = "Compiling YANG library: %s" % ctx.attr.name,
        executable = ctx.executable._yang_compiler,
    )

    ctx.actions.run_shell(
        inputs = [generated_sources],
        outputs = [ctx.outputs.srcjar],
        arguments = [
            ctx.outputs.srcjar.path,
            generated_sources.path,
        ],
        command = "jar cf $1 -C $2 src",
        progress_message = "Assembling YANG Java sources: %s" % ctx.attr.name,
    )

    ctx.actions.run_shell(
        inputs = [generated_sources],
        outputs = [ctx.outputs.schema],
        arguments = [
            ctx.outputs.schema.path,
            generated_sources.path
        ],
        command = "jar cf $1 -C $2 schema",
        progress_message = "Assembling YANG compiled schema: %s" % ctx.attr.name,
    )


# Rule to generate YANG library from the specified set of YANG models.
_yang_library = rule(
    attrs = {
        "deps": attr.label_list(),
        "srcs": attr.label_list(allow_files = True),
        "model_id": attr.string(),
        "_yang_compiler": attr.label(
            executable = True,
            cfg = "host",
            allow_files = True,
            default = Label("//tools/build/bazel:onos_yang_compiler"),
        ),
    },
    outputs = {
        "srcjar": "model.srcjar",
        "schema": "schema.jar",
    },
    fragments = ["java"],
    implementation = _yang_library_impl,
)

def yang_library(
    name = None,
    deps = None,
    yang_srcs = None,
    java_srcs = None,
    custom_registrator = False,
    visibility = ["//visibility:public"]):

    if name == None:
        name = "onos-" + native.package_name().replace("/", "-")
    if yang_srcs == None:
        yang_srcs = native.glob(["src/main/yang/**/*.yang"])
    if java_srcs == None:
        java_srcs = native.glob(["src/main/java/**/*.java"])
    if deps == None:
        deps = []

    deps += CORE_DEPS + ONOS_YANG + [
        "@onos_yang_runtime//jar",
        "//apps/yang:onos-apps-yang"
    ]

    # Generate the Java sources from YANG model
    _yang_library(name = name + "-generate", model_id = name, deps = deps, srcs = yang_srcs)

    srcs = [name + "-generate"]

    if len(java_srcs):
        srcs += [name + "-srcjar"]
        native.genrule(
            name = name + "-srcjar",
            srcs = java_srcs,
            outs = [name + ".srcjar"],
            cmd = "jar cf $(location %s.srcjar) $(SRCS)" % name
        )

    if not custom_registrator:
        srcs += [name + "-registrator"]
        native.genrule(
            name = name + "-registrator",
            outs = [REGISTRATOR_FILE],
            cmd = "echo '%s' > $(location %s)" % (REGISTRATOR, REGISTRATOR_FILE)
        )

    # Produce a Java library from the generated Java sources
    osgi_jar(name = name, srcs = srcs,
             resource_jars = [name + "-generate"], deps = deps,
             visibility = ["//visibility:public"],
             suppress_errorprone = True,
             suppress_checkstyle = True,
             suppress_javadocs = True,
    )

def yang_model(
    name = None,
    app_name = None,
    title = None,
    description = None,
    url = "http://onosproject.org/",
    custom_registrator = False,
    deps = None,
    yang_srcs = None,
    java_srcs = None,
    required_apps = [],
    visibility = ["//visibility:public"]):

    if name == None:
        name = "onos-" + native.package_name().replace("/", "-")

    yang_library(name = name, deps = deps,
                 yang_srcs = yang_srcs, java_srcs = java_srcs,
                 custom_registrator = custom_registrator,
                 visibility = ["//visibility:public"])

    onos_app(
        app_name = app_name,
        title = title,
        description = description,
        feature_name = name,
        version = ONOS_VERSION,
        url = url,
        category = "Models",
        included_bundles = [ name ],
        required_apps = required_apps + ["org.onosproject.yang"],
        visibility = ["//visibility:public"],
    )