#!/usr/bin/env python
# Copyright (C) 2015 Wayne Warren
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.

import argparse
import os

import jenkins_jobs.version

from stevedore import extension


def __version__():
    return (
        "Jenkins Job Builder version: %s"
        % jenkins_jobs.version.version_info.version_string()
    )


def create_parser():
    """Create an ArgumentParser object usable by JenkinsJobs."""
    parser = argparse.ArgumentParser()
    parser.add_argument(
        "--conf",
        dest="conf",
        default=os.environ.get("JJB_CONF", None),
        help="configuration file [JJB_CONF]",
    )
    parser.add_argument(
        "-l",
        "--log_level",
        dest="log_level",
        default=os.environ.get("JJB_LOG_LEVEL", "info"),
        help="log level (default: %(default)s) [JJB_LOG_LEVEL]",
    )
    parser.add_argument(
        "--ignore-cache",
        action="store_true",
        dest="ignore_cache",
        default=None,
        help="ignore the cache and update the jobs anyhow (that will "
        "only flush the specified jobs cache)",
    )
    parser.add_argument(
        "--flush-cache",
        action="store_true",
        dest="flush_cache",
        default=None,
        help="flush all the cache entries before updating",
    )
    parser.add_argument(
        "--version",
        dest="version",
        action="version",
        version=__version__(),
        help="show version",
    )
    parser.add_argument(
        "--allow-empty-variables",
        action="store_true",
        dest="allow_empty_variables",
        default=None,
        help="Don't fail if any of the variables inside any string are "
        "not defined, replace with empty string instead.",
    )
    parser.add_argument(
        "--server",
        "-s",
        dest="section",
        default=os.environ.get("JJB_SECTION", "jenkins"),
        help="The Jenkins server ini section to use. Defaults to 'jenkins' "
        "[JJB_SECTION]",
    )
    parser.add_argument(
        "--user",
        "-u",
        default=os.environ.get("JJB_USER", None),
        help="The Jenkins user to use for authentication. This overrides "
        "the user specified in the configuration file. [JJB_USER]",
    )
    parser.add_argument(
        "--password",
        "-p",
        default=os.environ.get("JJB_PASSWORD", None),
        help="Password or API token to use for authenticating towards Jenkins."
        " This overrides the password specified in the configuration file."
        " [JJB_PASSWORD]",
    )

    subparser = parser.add_subparsers(
        dest="command", help="update, test, list or delete job"
    )

    extension_manager = extension.ExtensionManager(
        namespace="jjb.cli.subcommands", invoke_on_load=True
    )

    def parse_subcommand_args(ext, subparser):
        ext.obj.parse_args(subparser)

    extension_manager.map(parse_subcommand_args, subparser)

    return parser
