#!/usr/bin/env python

import os
import argparse

CATKIN_MARKER_FILE = '.catkin'

def parse_arguments():
    parser = argparse.ArgumentParser(description='Generate environment variables for the rosjava maven environment.')
    cmd_group = parser.add_mutually_exclusive_group()
    cmd_group.add_argument('-d', '--maven-deployment-repository', action='store_true', help='Return the current devel workspace maven directory.')
    cmd_group.add_argument('-r', '--maven-repository', action='store_true', help='The url to the external ros maven repository.')
    cmd_group.add_argument('-m', '--maven-path', action='store_true', help='Generate maven path across all chained workspcaes.')
    cmd_group.add_argument('-g', '--gradle-user-home', action='store_true', help='Generate the local gradle user home in the current devel workspace (share/gradle).')
    args = parser.parse_args()
    return args

def get_workspaces(environ):
    '''
    Based on CMAKE_PREFIX_PATH return all catkin workspaces.
    '''
    # get all cmake prefix paths
    env_name = 'CMAKE_PREFIX_PATH'
    value = environ[env_name] if env_name in environ else ''
    paths = [path for path in value.split(os.pathsep) if path]
    # remove non-workspace paths
    workspaces = [path.replace(' ', '\ ') for path in paths if os.path.isfile(os.path.join(path, CATKIN_MARKER_FILE))]
    return workspaces

def get_environment_variable(environ, key):
    var = None
    try:
        var = environ[key]
    except KeyError:
        pass
    if var == '':
        var = None
    return var

if __name__ == '__main__':
    args = parse_arguments()
    environment_variables = dict(os.environ)
    workspaces = get_workspaces(environment_variables)
    if args.maven_deployment_repository:
        repo = get_environment_variable(environment_variables, 'ROS_MAVEN_DEPLOYMENT_REPOSITORY')
        if repo is None:
            repo = os.path.join(workspaces[0], 'share', 'maven')
        else:
            if repo in [os.path.join(w, 'share', 'maven') for w in workspaces]:
                repo = os.path.join(workspaces[0], 'share', 'maven')
        print(repo)
    elif args.maven_repository:
        repo = get_environment_variable(environment_variables, 'ROS_MAVEN_REPOSITORY')
        if repo is None:
            repo = 'https://github.com/rosjava/rosjava_mvn_repo/raw/master'
        print(repo)
    elif args.maven_path:
        new_maven_paths = [os.path.join(path, 'share', 'maven') for path in workspaces]
        maven_paths = get_environment_variable(environment_variables, 'ROS_MAVEN_PATH')
        if maven_paths is None:
            maven_paths = new_maven_paths
        else:
            maven_paths = maven_paths.split(os.pathsep)
            common_paths = [p for p in maven_paths if p in new_maven_paths]
            if common_paths:
                maven_paths = new_maven_paths
        print(os.pathsep.join(maven_paths))
    elif args.gradle_user_home:
        home = get_environment_variable(environment_variables, 'GRADLE_USER_HOME')
        if home is None:
            home = os.path.join(workspaces[0], 'share', 'gradle')
        else:
            if home in [os.path.join(w, 'share', 'gradle') for w in workspaces]:
                home = os.path.join(workspaces[0], 'share', 'gradle')
        print(home)
    else:
        print("Nothing to see here - please provide one of the valid command switches.")