#!/usr/bin/env python2

'''
composeregistry.com CLI
'''

import re
import sys
import logging
import requests
from git import Repo
from termcolor import colored

logging.basicConfig(level=logging.WARN)

PATTERN = re.compile("^[1-8]$")

def print_resultset(items):
    """
    output resultset to console
    """
    for i, item in enumerate(items):
        print colored(str(i+1), 'yellow') + ' ' + \
          colored(item['owner'], 'magenta') + ' ' + item['name'] + ' ' + \
          colored('(' + str(item['stars']) + ')', 'red')

def clone(repo):
    """
    git clone repository from github
    """
    git_url = 'git@github.com:%s/%s.git' % (repo['owner'], repo['name'])
    print 'git clone ' + git_url
    Repo.clone_from(git_url, repo['name'])

def search(query):
    '''
    search for docker compose files on www.composeregistry.com
    '''
    response = requests.get('https://www.composeregistry.com/api/v1/search', \
        params={'query': query}, headers={'x-key': 'default'})

    if response.status_code == 200:
        data = response.json()
        logging.debug(data)
        items = data['items']
        print_resultset(items)

        if len(items) == 0:
            print 'no results found'
        else:
            choice = raw_input("\nselect an item: ")
            if PATTERN.match(choice):
                repo = items[int(choice)-1]
                clone(repo)
            else:
                logging.error('invalid choice: %s', choice)
    else:
        message = response.json()['error']
        raise RuntimeError('unable to process request: ' + message \
            + ', status code = ' + str(response.status_code))

def main():
    """
    main method, validates user input and query www.composeregistry.com/
    """
    if len(sys.argv) > 1:
        querystring = ' '.join(sys.argv[1:])
        logging.info('searching for %s', querystring)
        search(querystring)
    else:
        logging.error('usage: %s QUERY', sys.argv[0])

if __name__ == '__main__':
    main()
