include_defs('//onos.defs')

DEFAULT_APP_CATEGORY = 'Utility'

import os.path

# FIXME Factor this into common place
def _get_name():
    base_path = get_base_path()
    return ONOS_ARTIFACT_BASE + base_path.replace('/', '-') #TODO Unix-separator

def _get_app_name():
    base_path = get_base_path()
    return APP_PREFIX + os.path.basename(base_path)

def osgi_feature(
        name,
        title,
        feature_coords = None,
        version = ONOS_VERSION,
        required_features = [ 'onos-api' ],
        required_apps = [],
        included_bundles = None,
        excluded_bundles = [],
        generate_file = False,
        visibility = [ 'PUBLIC' ],
        stage_repo = True,
        maven_coords = None,
    ):

    if not feature_coords:
        feature_coords = name
    args = [ '-n %s' % feature_coords,
             '-v %s' % version,
             '-t "%s"' % title,
             ]
    args += [ '-f %s' % f for f in required_features ]
    args += [ '-b $(maven_coords %s)' % b for b in included_bundles ]
    args += [ '-e $(maven_coords %s)' % b for b in excluded_bundles ]
    args += [ '-d %s' % a for a in required_apps ]

    feature_cmd = '-F' if generate_file else '-E'

    cmd = '$(exe //buck-tools:onos-app-writer) %s ' % feature_cmd
    cmd += ' '.join(args) + ' > $OUT'
    genrule(
            name = name + '-feature',
            bash = cmd,
            out = 'features.xml',
            visibility = visibility,
            maven_coords = maven_coords,
    )

    if stage_repo:
        sources = ['$(location %s) $(maven_coords %s)' % (i, i) for i in included_bundles]
        genrule(
                name = name + '-repo',
                out = name + '-repo.zip.part',
                bash = '$(exe //buck-tools:onos-feature) $OUT ' + ' '.join(sources),
                visibility = visibility,
        )

FEATURES_HEADER = '''\
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0"
          name="onos-%s">
    <repository>mvn:org.apache.karaf.features/standard/3.0.8/xml/features</repository>

''' % ONOS_VERSION

FEATURES_FOOTER = '</features>'

def compile_features(
        name,
        features = [],
        maven_coords = None,
        visibility = [ 'PUBLIC' ],
    ):

    cmd = "(echo '%s'; " % FEATURES_HEADER
    cmd += ''.join(['cat $(location %s-feature); ' % s for s in features])
    cmd += "echo '%s') > $OUT" % FEATURES_FOOTER

    genrule(
            name = name,
            bash = cmd,
            visibility = visibility,
            out = 'features.xml',
            maven_coords = maven_coords,
    )


#TODO rename this
def osgi_feature_group(
        name,
        description = 'TEST',
        version = ONOS_VERSION,
        exported_deps = [],
        visibility = ['PUBLIC'],
        maven_coords = None,
        **kwargs
    ):
    java_library(
            name = name,
            exported_deps = exported_deps, #compile only
            visibility = visibility,
    )

    osgi_feature(
            name = name,
            feature_coords = name,
            version = version,
            title = description,
            required_features = [],
            included_bundles = exported_deps,
            generate_file = False,
            visibility = visibility,
            maven_coords = maven_coords,
    )



def onos_app(
        app_name = None,
        name = None,
        title = None,
        version = ONOS_VERSION,
        origin = ONOS_ORIGIN,
        category = DEFAULT_APP_CATEGORY,
        url = None,
        description = None, #TODO make this a file
        #TODO icon,
        feature_coords = None,
        required_features = [ 'onos-api' ],
        required_apps = [],
        included_bundles = None,
        excluded_bundles = [],
        visibility = [ 'PUBLIC' ],
        **kwargs):
    if name is None:
        name = _get_name()

    if app_name is None:
        app_name = _get_app_name()

    maven_coords = '%s:%s:oar:%s' % ( ONOS_GROUP_ID, name, ONOS_VERSION )
    feature_xml_coords = '%s:%s:xml:features:%s' % ( ONOS_GROUP_ID, name, ONOS_VERSION )

    if title is None:
        print "Missing title for %s" % _get_name()
        title = _get_app_name()

    if included_bundles is None:
        target = ':' + _get_name()
        included_bundles = [ target ]

    if not feature_coords and len(included_bundles) == 1:
        feature_coords = '$(maven_coords %s)' % included_bundles[0]

    if not feature_coords:
        feature_coords = '%s:%s:%s' % ( ONOS_GROUP_ID, _get_name(), ONOS_VERSION )

    args = [ '-n %s' % feature_coords,
             '-v %s' % version,
             '-t "%s"' % title,
             '-o "%s"' % origin,
             '-c "%s"' % category,
             '-a "%s"' % app_name,
             '-u %s' % url,
             ]
    args += [ '-f %s' % f for f in required_features ]
    args += [ '-b $(maven_coords %s)' % b for b in included_bundles ]
    args += [ '-e $(maven_coords %s)' % b for b in excluded_bundles ]
    args += [ '-d %s' % a for a in required_apps ]

    # cmd = '$(exe //buck-tools:onos-app-writer) -F ' + ' '.join(args) + ' > $OUT'
    # genrule(
    #     name = name + '-feature',
    #     bash = cmd,
    #     out = 'features.xml',
    #     visibility = [],
    # )
    osgi_feature(
        name = name,
        feature_coords = feature_coords,
        version = version,
        title = title,
        required_features = required_features,
        included_bundles = included_bundles,
        excluded_bundles = excluded_bundles,
        generate_file = True,
        visibility = [],
        stage_repo = False,
        maven_coords = feature_xml_coords,
    )

    cmd = '$(exe //buck-tools:onos-app-writer) -A ' + ' '.join(args) + ' > $OUT'
    genrule(
        name = name + '-app-xml',
        bash = cmd,
        out = 'app.xml',
        visibility = [],
    )

    sources = [
        '$(location :%s-feature) %s' % (name, feature_coords),
        '$(location :%s-app-xml) NONE' % name,
    ]
    sources += ['$(location %s) $(maven_coords %s)' % (i, i) for i in included_bundles]
    genrule(
        name = name + '-oar',
        out = 'app.oar',
        bash = '$(exe //buck-tools:onos-app-oar) $OUT ' + ' '.join(sources),
        maven_coords = maven_coords,
        visibility = visibility,
    )
