#!/usr/bin/env python
#       Licensed to the Apache Software Foundation (ASF) under one
#       or more contributor license agreements.  See the NOTICE file
#       distributed with this work for additional information
#       regarding copyright ownership.  The ASF licenses this file
#       to you 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 sys
import argparse
import requests
from pprint import pprint


def get_opts():
    parser = argparse.ArgumentParser(
        description='Post a new ticket using the API')
    parser.add_argument('project', help='Project shortname')
    parser.add_argument('mount_point', help='Tracker mount point')
    parser.add_argument('-H', '--host', default='sourceforge.net')
    opts = parser.parse_args()
    opts.url = 'https://{}/rest/p/{}/{}/new'.format(opts.host,
                                                    opts.project, opts.mount_point)
    return opts

opts = get_opts()
access_token = raw_input('Access (bearer) token: ')
summary = raw_input('Summary: ')
print 'Description (C-d to end):'
print '-----------------------------------------------'
description = sys.stdin.read()
print '-----------------------------------------------'

r = requests.post(opts.url, params={
    'access_token': access_token,
    'ticket_form.summary': summary,
    'ticket_form.description': description,
})
if r.status_code == 200:
    print 'Ticket created at: %s' % r.url
    pprint(r.json())
else:
    print 'Error [%s]:\n%s' % (r.status_code, r.text)
