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/org/onosproject/**/'
TEST = 'src/test/java/org/onosproject/**/'
RESOURCES_ROOT = 'src/main/resources/'

ONOS_GROUP_ID = 'org.onosproject'
ONOS_VERSION = '1.6.0-SNAPSHOT'

def osgi_jar(
    name,
    srcs,
    test_srcs = None,
    group_id = ONOS_GROUP_ID,
    version = ONOS_VERSION,
    deps = [],
    test_deps = [ '//lib:TEST' ],
    visibility = ['PUBLIC'],
    license = 'NONE',
    description = '',
    debug = False,
    import_packages = '*',
    export_packages = '*',
    include_resources = NONE,
    web_context = NONE,
    resources = None,
    resources_root = None,
    test_resources = None,
    test_resources_root = None,
    **kwargs
    ):

  bare_jar_name = name + '-jar'
  osgi_jar_name = name + '-osgi'
  mvn_coords = group_id + ':' + name + ':' + version

  if resources and not resources_root:
      resources_root = RESOURCES_ROOT

  java_library(
      name = bare_jar_name,
      srcs = srcs,
      deps = deps,
      visibility = [], #intentially, not visible
      resources = resources,
      resources_root = resources_root,
      **kwargs
  )

  cp = ':'.join(['$(classpath %s)' % c for c in deps])

  args = ( '$(location :%s)' % bare_jar_name, #input jar
           '$OUT',                            #output jar
           cp,                                #classpath
           name,                              #bundle name
           group_id,                          #group id
           version,                           #version
           license,                           #license url
           "'%s'" % import_packages,          #packages to import
           "'%s'" % export_packages,          #packages to export
           include_resources,                 #custom includes to classpath
           web_context,                       #web context (REST API only)
           description,                       #description
          )

  #TODO stage_jar is a horrendous hack
  stage_jar = 'pushd $SRCDIR; mkdir bin; cd bin; jar xf $(location :%s); ls; popd; ' % bare_jar_name
  wrap_jar = '$(exe //utils/osgiwrap:osgi-jar) ' + ' '.join(args)
  bash = stage_jar + wrap_jar
  if debug:
    bash = stage_jar + DEBUG_ARG + ' ' + wrap_jar
    print bash
  # TODO this is a hack to add checkstyle as dependency before generating jar
  bash = 'ls $(location :' + name + '-checkstyle) > /dev/null; ' + bash

  genrule(
    name = osgi_jar_name,
    bash = bash,
    out = '%s-%s.jar' % (name, version), #FIXME add version to jar file
    srcs =  glob(['src/main/webapp/**']),
    visibility = [], #intentially, not visible
  )

  # TODO we really should shade the jar with maven flavor
  prebuilt_jar(
    name = name,
    maven_coords = mvn_coords,
    binary_jar = ':' + osgi_jar_name,
    visibility = visibility,
  )



  ### Checkstyle
  chk_cmd = ' '.join(( 'java -jar $(location //lib:checkstyle)',
                       '-o $OUT',
                       '-c $(location //tools/build/conf:checkstyle-xml)',
                       ' '.join(srcs) ))
  error_cmd = '(touch $OUT; cat $OUT | grep "^\[ERROR\]"; exit 1)'
  cmd = ' || '.join((chk_cmd, error_cmd))
  genrule(
    name = name + '-checkstyle',
    bash = cmd,
    srcs = srcs,
    out = 'checkstyle.log',
  )

  ### .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,
  )


  if test_resources and not test_resources_root:
      test_resources_root = RESOURCES_ROOT

  if test_srcs:
      java_test(
        name = 'tests',
        srcs = test_srcs,
        deps = deps +
               test_deps +
               [':' + bare_jar_name],
        source_under_test = [':' + bare_jar_name],
        resources = test_resources,
        resources_root = test_resources_root
        )
