#!/usr/bin/env python

import jenkins
import optparse
import os
import pkg_resources
import sys
import yaml

import jenkins_tools
from rospkg import environment


def build_job(jenkins_instance, job_name):
    #return jenkins_instance.build_job(job_name)
    # replicate internal implementation of Jenkins.build_job()
    import urllib2
    if not jenkins_instance.job_exists(job_name):
        raise jenkins.JenkinsException('no such job[%s]' % (job_name))
    # pass parameters to create a POST request instead of GET
    return jenkins_instance.jenkins_open(urllib2.Request(jenkins_instance.build_job_url(job_name), 'foo=bar'))


# Schedule all devel jobs on Jenkins
def main():
    parser = optparse.OptionParser()
    parser.add_option("--name", action="store", default=None)
    (options, args) = parser.parse_args()
    if len(args) <= 3 or len(args) % 2 != 0:
        print "Usage: %s email ros_distro [repository version]" % (sys.argv[0])
        sys.exit(0)

    email = args[0]
    ros_distro = args[1]
    repo_names = [args[2:][i] for i in range(0, len(args[2:]), 2)]
    repo_versions = [args[2:][i + 1] for i in range(0, len(args[2:]), 2)]

    # generate job name
    job_name = 'prerelease-' + ros_distro + '-' + '-'.join(repo_names)
    if options.name:      # add user defined prefix
        job_name = options.name + "-" + job_name
    if len(job_name) > 50:    # limit length of job name
        job_name = job_name[:48] + "..."

    # create jenkins instance
    with open(os.path.join(environment.get_ros_home(), 'buildfarm', 'server.yaml')) as f:
        info = yaml.load(f)
    jenkins_instance = jenkins.Jenkins(jenkins_tools.JENKINS_SERVER, info['username'], info['password'])

    # parameters
    script_args = [ros_distro]
    param_names = [n + "_VERSION" for n in repo_names]
    parameters = [{'EMAIL_PARAM': email}]
    for r, p, v in zip(repo_names, param_names, repo_versions):
        parameters[0][p] = v
        script_args.append(r)
        script_args.append('$' + p)

    additional_publishers = pkg_resources.resource_string('jenkins_tools', 'resources/templates/publisher_notification_on_success.xml')

    # create all jobs
    jenkins_tools.run_jenkins_now(jenkins_instance, '$UBUNTU_PARAM', '$ARCH_PARAM', job_name, 'ros-buildfarm-prerelease@googlegroups.com $EMAIL_PARAM',
                                  'prerelease',  # script to run
                                  script_args,  # script arguments
                                  info['username'],  # user name
                                  parameters,  # parameters
                                  {'UBUNTU_PARAM': ['precise'], 'ARCH_PARAM': ['amd64']},  # matrix
                                  additional_publishers=additional_publishers)
    build_job(jenkins_instance, job_name)
    print "View the job's progress on <http://jenkins.ros.org/view/Prerelease/job/%s>" % job_name


if __name__ == "__main__":
    main()
