#!/usr/bin/env python
# coding=utf-8
"""This script uploads a plugin package to the plugin repository.
Authors: A. Pasotti, V. Picavet
git sha              : $TemplateVCSFormat
"""

import getpass
import sys
import xmlrpc.client
from optparse import OptionParser

standard_library.install_aliases()

# Configuration
PROTOCOL = 'https'
SERVER = 'plugins.qgis.org'
PORT = '443'
ENDPOINT = '/plugins/RPC2/'
VERBOSE = False


def main(parameters, arguments):
    """Main entry point.

    :param parameters: Command line parameters.
    :param arguments: Command line arguments.
    """
    address = (
        '{protocol}://{username}:{password}@{server}:{port}{endpoint}'.format(
            protocol=PROTOCOL,
            username=parameters.username,
            password=parameters.password,
            server=parameters.server,
            port=parameters.port,
            endpoint=ENDPOINT,
        )
    )
    print('Connecting to: %s' % hide_password(address))

    server = xmlrpc.client.ServerProxy(address, verbose=VERBOSE)

    try:
        with open(arguments[0], 'rb') as handle:
            plugin_id, version_id = server.plugin.upload(
                xmlrpc.client.Binary(handle.read())
            )
        print('Plugin ID: %s' % plugin_id)
        print('Version ID: %s' % version_id)
    except xmlrpc.client.ProtocolError as err:
        print('A protocol error occurred')
        print('URL: %s' % hide_password(err.url, 0))
        print('HTTP/HTTPS headers: %s' % err.headers)
        print('Error code: %d' % err.errcode)
        print('Error message: %s' % err.errmsg)
    except xmlrpc.client.Fault as err:
        print('A fault occurred')
        print('Fault code: %d' % err.faultCode)
        print('Fault string: %s' % err.faultString)


def hide_password(url, start=6):
    """Returns the http url with password part replaced with '*'.

    :param url: URL to upload the plugin to.
    :type url: str

    :param start: Position of start of password.
    :type start: int
    """
    start_position = url.find(':', start) + 1
    end_position = url.find('@')
    return '%s%s%s' % (
        url[:start_position],
        '*' * (end_position - start_position),
        url[end_position:],
    )


if __name__ == '__main__':
    parser = OptionParser(usage='%prog [options] plugin.zip')
    parser.add_option(
        '-w',
        '--password',
        dest='password',
        help='Password for plugin site',
        metavar='******',
    )
    parser.add_option(
        '-u',
        '--username',
        dest='username',
        help='Username of plugin site',
        metavar='user',
    )
    parser.add_option(
        '-p',
        '--port',
        dest='port',
        help='Server port to connect to',
        metavar='80',
    )
    parser.add_option(
        '-s',
        '--server',
        dest='server',
        help='Specify server name',
        metavar='plugins.qgis.org',
    )
    options, args = parser.parse_args()
    if len(args) != 1:
        print('Please specify zip file.\n')
        parser.print_help()
        sys.exit(1)
    if not options.server:
        options.server = SERVER
    if not options.port:
        options.port = PORT
    if not options.username:
        # interactive mode
        username = getpass.getuser()
        print('Please enter user name [%s] :' % username, end=' ')

        res = input()
        if res != '':
            options.username = res
        else:
            options.username = username
    if not options.password:
        # interactive mode
        options.password = getpass.getpass()
    main(options, args)
