include_defs('//onos.defs')
include_defs('//bucklets/onos.bucklet')


PROTOC_VERSION = '3.2.0'
GRPC_PLUGIN_VERSION = '1.3.0'

PROTOC_EXECUTABLE_BASE_URL = "https://repo1.maven.org/maven2/com/google/protobuf/protoc"
GRPC_PLUGIN_BASE_URL = "https://repo1.maven.org/maven2/io/grpc/protoc-gen-grpc-java"

PROTOC_SHA1S = {
    "protoc-3.3.0-osx-x86_64.exe":"3070e439f9557bb72fb04df631f29d7556c9029c",
    "protoc-3.3.0-linux-x86_64.exe":"e6a95fc7477c602cc402ed976d3edbd82c841879",
    "protoc-3.2.0-linux-x86_64.exe":"086893ffdc1023e503ccd0ee522ca1e6046b12a7",
    "protoc-3.2.0-osx-x86_64.exe":"87f532ef51bb314d2c5d2ba7842b39cbbdb60323"
}

GRPC_JAVA_SHA1S = {
    "protoc-gen-grpc-java-1.3.0-linux-x86_64.exe":"44a0fa3e6074852ea84f93d258233b3f4f6d9e53",
    "protoc-gen-grpc-java-1.3.0-osx-x86_64.exe":"61a1b81b9f0af7d0900c314a4201972b52fb5f12"
}

#Returns the string for the OS and architecture of the system of the form 'OS-ARCH'
def get_system_arch():
    import platform
    os = platform.system().lower()
    arch = platform.machine()
    if os == "darwin":
        os = "osx"
    return "%s-%s" % ( os, arch)

def fetch_protoc_binary(
        protoc_version = PROTOC_VERSION
    ):
    file_name = "protoc-%s-%s.exe" % (protoc_version, get_system_arch())
    if file_name not in PROTOC_SHA1S:
        raise Exception('Cannot download %s, architecture not supported' % file_name)
    remote_file(
        name = 'fetch-protoc-binary-' + protoc_version,
        out = 'protoc-binary',
        url = PROTOC_EXECUTABLE_BASE_URL + '/' + protoc_version + '/' + file_name,
        sha1 = PROTOC_SHA1S[file_name],
    )
    genrule(
        name = 'prepare-protoc-executable-' + protoc_version,
        srcs = [ ':fetch-protoc-binary-' + protoc_version ],
        bash = 'cp $(location :fetch-protoc-binary-' + protoc_version +') $OUT && chmod +x $OUT',
        executable = True,
        visibility = [ "PUBLIC" ],
        out = 'protoc.exe',
    )

def fetch_grpc_plugin_binary(
        grpc_plugin_version = GRPC_PLUGIN_VERSION
):
    file_name = "protoc-gen-grpc-java-%s-%s.exe" % (grpc_plugin_version, get_system_arch())
    if file_name not in GRPC_JAVA_SHA1S:
        raise Exception('Cannot download %s, architecture not supported' % file_name)
    remote_file(
        name = 'fetch-grpc-plugin-binary-' + grpc_plugin_version,
        out = 'grpc-plugin-binary',
        url = GRPC_PLUGIN_BASE_URL + '/' + grpc_plugin_version + '/' + file_name,
        sha1 = GRPC_JAVA_SHA1S[file_name],
    )
    genrule(
        name = 'prepare-grpc-plugin-executable-' + grpc_plugin_version,
        srcs = [ ':fetch-grpc-plugin-binary-' + grpc_plugin_version ],
        bash = 'cp $(location :fetch-grpc-plugin-binary-' + grpc_plugin_version + ') $OUT && chmod +x $OUT',
        executable = True,
        visibility = [ "PUBLIC" ],
        out = 'grpc-plugin.exe',
    )

def _get_name():
    base_path = get_base_path()
    return ONOS_ARTIFACT_BASE + base_path.replace('/', '-') #TODO Unix-separator

def grpc_jar(
    name = None,
    deps = [],
    #NOTE: if targeting a directory also built with maven this path MUST end in
        # /proto because maven plugin interprets imports relative to the proto
        # directory and BUCK interprets imports relative to the last directory
        # listed in the first listed proto_path which contains the specified
        # file
    proto_paths = [],
    proto_match_patterns = [ "**/proto/**/*.proto" ],
    protoc_version = PROTOC_VERSION,
    plugin_version = GRPC_PLUGIN_VERSION,
    **kwargs
    ):

    #Get the correct name for the protoc compilation call
    if name is None:
        name = _get_name()

    #Create the string for the proto_path arguments (order matters, similar to classpath)
    if len(proto_paths) != 0:
        proto_paths_string = "-I=" + reduce(lambda a,b:  a +" -I=" + b, proto_paths)
    else:
        proto_paths_string = ""
    protoc = name + '-protoc'

    genrule(
        name = protoc,
        srcs = glob(proto_match_patterns),
        out = 'grpc.src.zip',
        cmd = '$(location //buck-tools:grpc) $OUT '
              + '\"' + proto_paths_string + '\" '
              + '$(location //incubator/protobuf-dependencies:prepare-protoc-executable-'+ protoc_version + ') '
              + '$(location //incubator/grpc-dependencies:prepare-grpc-plugin-executable-' + plugin_version + ') '
              + '$SRCS',
    )

    osgi_jar_with_tests(
        name = name,
        srcs = [ ':' + protoc ],
        deps = deps + [ ':' + protoc ],
        do_javadocs = False,
        do_checkstyle = False,
        **kwargs
    )
