# THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS
# FOR A PARTICULAR PURPOSE. THIS CODE AND INFORMATION ARE NOT SUPPORTED BY XEBIALABS.

import httplib
import unittest
import urllib2
import base64
import sys
import json

# Parameters to be changed
username = "admin"
password = "admin"
baseUrl = "http://localhost:5516" # Or HTTPS
numberByPage = 1000
# set these to a file path to use client auth, e.g. if XL Release is running using mutual SSL:
#pemFile = '/path/to/my/key.pem'
#clientCertFile = '/path/to/my/cert.pem'
pemFile = None
clientCertFile = None
forceSslv3 = False

# see https://stackoverflow.com/questions/17927339/forcing-mechanize-to-use-sslv3
if forceSslv3:
    import ssl
    from ssl import PROTOCOL_SSLv23, PROTOCOL_SSLv3, CERT_NONE, SSLSocket

    def monkey_wrap_socket(sock, keyfile=None, certfile=None,
                           server_side=False, cert_reqs=CERT_NONE,
                           ssl_version=PROTOCOL_SSLv23, ca_certs=None,
                           do_handshake_on_connect=True,
                           suppress_ragged_eofs=True, ciphers=None):
        ssl_version = PROTOCOL_SSLv3
        # for Python 2.6 or lower, remove the "ciphers" argument
        return SSLSocket(sock, keyfile=keyfile, certfile=certfile,
                         server_side=server_side, cert_reqs=cert_reqs,
                         ssl_version=ssl_version, ca_certs=ca_certs,
                         do_handshake_on_connect=do_handshake_on_connect,
                         suppress_ragged_eofs=suppress_ragged_eofs,
                         ciphers=ciphers)

    ssl.wrap_socket = monkey_wrap_socket

# see http://www.osmonov.com/2009/04/client-certificates-with-urllib2.html
class HTTPSClientAuthHandler(urllib2.HTTPSHandler):
    def __init__(self, key, cert):
        urllib2.HTTPSHandler.__init__(self)
        self.key = key
        self.cert = cert
    def https_open(self, req):
        #Rather than pass in a reference to a connection class, we pass in
        # a reference to a function which, for all intents and purposes,
        # will behave as a constructor
        return self.do_open(self.getConnection, req)
    def getConnection(self, host, timeout=300):
        return httplib.HTTPSConnection(host, key_file=self.key, cert_file=self.cert)

if pemFile is not None and clientCertFile is not None:
    cert_handler = HTTPSClientAuthHandler(pemFile, clientCertFile)
    opener = urllib2.build_opener(cert_handler)
    urllib2.install_opener(opener)

def releases_search_req(uri, username, password):
    print "."
    req = urllib2.Request(uri, data='{"active": true, "onlyMine": false, "onlyFlagged": false, "planned": true, "completed": true, "filter": ""}', headers={'Content-Type': 'application/json'})
    base64string = base64.encodestring('%s:%s' % (username, password))[:-1]
    req.add_header("Authorization", "Basic %s" % base64string)
    return urllib2.urlopen(req)

def templates_search_req(uri, username, password):
    print "."
    req = urllib2.Request(uri, headers={'Content-Type': 'application/json'})
    base64string = base64.encodestring('%s:%s' % (username, password))[:-1]
    req.add_header("Authorization", "Basic %s" % base64string)
    return urllib2.urlopen(req)

def releases_resp_by_page(p):
    url = "%s/releases/search?numberbypage=%s&page=%s" % (baseUrl, numberByPage, p)
    return releases_search_req(url, username, password).read()

def templates_resp_by_page(p):
    url = "%s/releases/templates?numberbypage=%s&page=%s" % (baseUrl, numberByPage, p)
    return templates_search_req(url, username, password).read()

def templates_resp_by_page2():
    url = "%s/api/v1/templates" % (baseUrl)
    return templates_search_req(url, username, password).read()

def count_results(respByPage):
    goOn = True
    page = 0
    amount = 0

    while goOn:
        j = json.loads(respByPage(page))
        amount += len(j['cis'])
        page += 1
        goOn = len(j['cis']) > 0

    return amount

def triggers(respByPage):
     j = json.loads(respByPage())
     for ci in j:
         if len(ci['releaseTriggers']) > 0:
            print "Template with id %s has : %s triggers" % (ci['id'], len(ci['releaseTriggers']))
            print "    Triggers are : "
            for trigger in ci['releaseTriggers']:
                 print "                 %s trigger (enabled: %s)" % (trigger['type'], trigger['enabled'])


releases_count = count_results(releases_resp_by_page)
templates_count = count_results(templates_resp_by_page)
print "Amount of templates: %s" % templates_count
print "Amount of releases: %s" % releases_count
triggers(templates_resp_by_page2)