#!/usr/bin/env python
# vim: set fileencoding=utf-8 :
#
# Author:   lambdalisue (lambdalisue@hashnote.net)
# URL:      http://hashnote.net/
# License:  MIT license
# Created:  2013-01-16
#
import argparse
import socket
import requests
from shareboard.parser import ShellParser
from shareboard.server import RequestServer


HOST = 'localhost'
PORT = 8081
ENCODING = 'utf-8'
DEFAULT_TIMEOUT = 5.0


def is_running(host, port):
    s = socket.socket()
    try:
        s.settimeout(1)
        s.connect((host, port))
        return True
    except socket.error:
        return False


def start(args):
    if is_running(args.host, args.port):
        print "%s:%s is already taken" % (args.host, args.port)
        exit(1)

    # Create command if it's specified
    if args.command:
        command = ShellParser(args.command).parse
    else:
        command = None

    server = RequestServer(args.host, args.port, args.encoding,
                           callback=command, silent=args.silent)

    if not args.viewer:
        # simply start shareboard server
        server.start()
    else:
        from shareboard.gui.main import start_with
        start_with(server)


def set(args):
    url = 'http://%s:%s/' % (args.host, args.port)
    kwargs = {
            'data': {'text': args.text, 'filename': args.filename},
            'timeout': args.timeout,
        }
    requests.post(url, **kwargs)


def get(args):
    url = 'http://%s:%s/' % (args.host, args.port)
    # text should be passed as encoded text
    kwargs = {
            'timeout': args.timeout,
        }
    res = requests.get(url, timeout=args.timeout)
    print res.text


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('-o', '--host', dest='host', default=HOST,
                        help='IP or Name of shareboard server')
    parser.add_argument('-p', '--port', dest='port', default=PORT, type=int,
                        help='Port number of shareboard server')
    parser.add_argument('-e', '--encoding', dest='encoding', default='utf-8',
                        help='Encoding')
    subparsers = parser.add_subparsers()

    # create the subparser for the 'start' command
    parser_start = subparsers.add_parser('start',
                                         help='Start shareboard server')
    parser_start.add_argument('-c', '--command',
                              help='Shell command executed to parse data')
    parser_start.add_argument('-s', '--silent', default=False, action='store_true',
                              help='Do not print access log')
    parser_start.add_argument('-v', '--viewer', default=False, action='store_true',
                              help='Start shareboard viewer. Qt and PySide are required to be installed')
    parser_start.set_defaults(func=start)
    # create the subparser for the 'set' command
    parser_set = subparsers.add_parser('set',
                                       help='Post new data to the shareboard')
    parser_set.add_argument('text',
                            help='Text data to be seted to the shareboard')
    parser_set.add_argument('-f', '--filename', default='index.html',
                            help='Filename of the text data. To use resolve relative path')
    parser_set.add_argument('-t', '--timeout', default=DEFAULT_TIMEOUT, type=float,
                            help='Seconds to timeout the connection')
    parser_set.set_defaults(func=set)
    # create the subparser for the 'get' command
    parser_get = subparsers.add_parser('get',
                                       help='Get data from the shareboard')
    parser_get.add_argument('-t', '--timeout', default=DEFAULT_TIMEOUT, type=float,
                            help='Seconds to timeout the connection')
    parser_get.set_defaults(func=get)

    args = parser.parse_args()
    args.func(args)

if __name__ == '__main__':
    main()
