#!/usr/bin/env python2.7
import os

import subprocess

JAVA_LANGUAGE_LEVEL = 8

EXCLUDE_DIRECTORIES = (
    "target",
)

TEST_SOURCES = (
    "*/src/test/*",
)

TEMPLATE = """# Autogenerated with {script_name}
workspace_type: java
java_language_level: {language_level}

directories:
  .
{exclude_dirs}

targets:
{targets}

test_sources:
{test_sources}
"""


def get_library_targets():
    this_dir = os.path.dirname(os.path.realpath(__file__))
    out = subprocess.check_output([
        "bazel", "query", "kind(\"java_library\", //...:all)"], cwd=this_dir)
    return out.strip().split("\n")


def gen_project():
    all_targets = get_library_targets()
    all_targets.sort()
    data = {
        "script_name": os.path.basename(__file__),
        "language_level": JAVA_LANGUAGE_LEVEL,
        "exclude_dirs": "\n".join(
            map(lambda x: "  -" + x, EXCLUDE_DIRECTORIES)),
        "targets": "\n".join(map(lambda x: "  " + x, all_targets)),
        "test_sources": "\n".join(map(lambda x: "  " + x, TEST_SOURCES)),
    }
    return TEMPLATE.format(**data)


if __name__ == "__main__":
    print gen_project()
