import random

DEBUG_ARG='JAVA_TOOL_OPTIONS="-Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=5005,suspend=y"'
FORCE_INSTALL=True
NONE='NONE'

SRC = 'src/main/java/**/'
TEST = 'src/test/java/**/'
RESOURCES_ROOT = 'src/main/resources/'
TEST_RESOURCES_ROOT = 'src/test/resources/'

include_defs('//onos.defs')

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

def checkstyle(
    name,
    srcs = None,
    jar_target = None,
    ):

    if srcs and jar_target:
        base = get_base_path()
        files = '%s\n%s\n' % (name, base) + '\n'.join(['%s/%s' % (base, s) for s in srcs])

        genrule(
                name = name + '-checkstyle-files',
                bash = "echo '%s' > $OUT" % files,
                srcs = srcs,
                out = 'checkstyle-files.txt',
        )

        sh_test(
                name = name + '-checkstyle',
                test = '//tools/build/conf:start-buck-daemon',
                deps = [ jar_target ],
                args = [
                    '$(location //tools/build/conf:buck-daemon-jar)',
                    'checkstyle',
                    '$(location :' + name + '-checkstyle-files)',
                    '$(location //tools/build/conf:checkstyle-xml)',
                    '$(location //tools/build/conf:suppressions-xml)',
                    ],
                test_rule_timeout_ms = 20000,
                labels = [ 'checkstyle' ],
        )

def java_doc(
    name,
    title,
    pkgs,
    paths,
    srcs = [],
    deps = [],
    visibility = [],
    do_it_wrong = False,
  ):
  if do_it_wrong:
    sourcepath = paths
  else:
    sourcepath = ['$SRCDIR/' + n for n in paths]

  if len(srcs) != 0:
    cmd = ' '.join([
        'while ! test -f .buckconfig; do cd ..; done;',
        'javadoc',
        '-tag onos.rsModel:a:"onos model"',
        '-quiet',
        '-protected',
        '-encoding UTF-8',
        '-charset UTF-8',
        '-notimestamp',
        '-windowtitle "' + title + '"',
        '-link http://docs.oracle.com/javase/8/docs/api',
        '-subpackages ',
        ':'.join(pkgs),
        '-sourcepath ',
        ':'.join(sourcepath),
        ' -classpath ',
        ':'.join(['$(classpath %s)' % n for n in deps]),
        '-d $TMP',
      ]) + ';jar cf $OUT -C $TMP .'

    genrule(
      name = name,
      cmd = cmd,
      srcs = srcs,
      out = name + '.jar',
      visibility = visibility,
)


def osgi_jar(
    name = None,
    srcs = None,
    group_id = ONOS_GROUP_ID,
    version = ONOS_VERSION,
    deps = [],
    visibility = ['PUBLIC'],
    license = 'NONE',
    description = '',
    debug = False,
    import_packages = '*',
    dynamicimport_packages = '',
    export_packages = '*',
    package_name_root = 'org.onosproject',
    include_resources = NONE,
    web_context = NONE,
    api_title = NONE,
    api_version = NONE,
    api_package = NONE,
    api_description = NONE,
    resources = NONE,
    resources_root = None,
    tests = None,
    **kwargs
    ):

  # if name and _get_name() != name:
  #     print _get_name(), '!=', name
  if name is None:
      name = _get_name()

  if srcs is None:
      srcs = glob([SRC + '/*.java'])

  if resources == NONE and resources_root is not None:
      resources = glob([resources_root + '**'])
  elif resources == NONE:
      resources = glob([RESOURCES_ROOT + '**'])

  if resources and not resources_root:
      resources_root = RESOURCES_ROOT

  if api_title != NONE:
      r = 'WEB-INF/classes/apidoc/swagger.json=swagger.json'
      include_resources = include_resources + ',' + r if include_resources != NONE else r

  mvn_coords = group_id + ':' + name + ':' + version

  onos_jar(
      name = name,
      srcs = srcs + glob(['src/main/webapp/**']),
      deps = deps,
      visibility = visibility,
      resources = resources,
      resources_root = resources_root,
      bundle_name = name,
      group_id = group_id,
      bundle_version = version,
      bundle_license = license,
      bundle_description = description,
      import_packages = import_packages,
      export_packages = export_packages,
      include_resources = include_resources,
      dynamicimport_packages = dynamicimport_packages,
      web_context = web_context,
      api_title = api_title,
      api_version = api_version,
      api_package = api_package,
      api_description = api_description,
      tests = tests,
      maven_coords = mvn_coords,
      **kwargs
  )

  ### Checkstyle
  checkstyle(
      name = name + '-checkstyle-files',
      srcs = srcs,
      jar_target = ':'+ name,
  )

  java_doc(
       name = name + '-javadoc',
       title = 'Java Docs',
       pkgs = [ package_name_root ],
       paths = [ 'src/main/java' ],
       srcs = srcs,
       deps = deps,
       visibility = visibility,
       do_it_wrong = False,
  )

  # TODO add project config for intellij
  # project_config(
  #   src_target = ':' + name,
  #   src_roots = [ 'src/main/java' ],
  #   test_target = ':' + name + '-tests',
  #   test_roots = [ 'src/test/java' ],
  # )

  ### .m2 Install
  mvn_cmd = ' '.join(( 'mvn install:install-file',
                       '-Dfile=$(location :%s)' % name,
                       '-DgroupId=%s' % group_id,
                       '-DartifactId=%s' % name,
                       '-Dversion=%s' % version,
                       '-Dpackaging=jar' ))
  cmd = mvn_cmd + ' > $OUT'
  if FORCE_INSTALL:
    # Add a random number to the command to force this rule to run.
    # TODO We should make this configurable from CLI, perhaps with a flag.
    cmd = 'FOO=%s ' % random.random() + cmd
  genrule(
    name = name + '-install',
    bash = cmd,
    out = 'install.log',
    visibility = visibility,
  )

def osgi_jar_with_tests(
        name = None,
        deps = [],
        group_id = ONOS_GROUP_ID,
        version = ONOS_VERSION,
        test_srcs = None,
        test_deps = [ '//lib:TEST' ],
        test_resources = None,
        test_resources_root = None,
        visibility = [ 'PUBLIC' ],
        **kwargs
    ):

  if name is None:
      name = _get_name()

  osgi_jar(name = name,
           deps = deps,
           group_id = group_id,
           version = version,
           visibility = visibility,
           tests = [':' + name + '-tests'],
           **kwargs)

  if test_resources and not test_resources_root:
      test_resources_root = TEST_RESOURCES_ROOT
  if test_resources_root and not test_resources:
      test_resources = glob([test_resources_root + '**'])
  if not test_resources and not test_resources_root:
      test_resources = glob([TEST_RESOURCES_ROOT + '**'])
      if test_resources:
        test_resources_root = TEST_RESOURCES_ROOT

  if test_srcs is None:
      test_srcs = glob([TEST + '/*.java'])

  mvn_coords = group_id + ':' + name + ':jar:tests:' + version

  java_test(
    name = name + '-tests',
    srcs = test_srcs,
    deps = deps +
           test_deps +
           [':' + name + '#non-osgi'],
    resources = test_resources,
    resources_root = test_resources_root,
    maven_coords = mvn_coords,
    visibility = visibility,
  )

  checkstyle(
      name = name + '-tests',
      srcs = test_srcs,
      jar_target = ':' + name + '-tests',
  )
