#!/usr/bin/env python -u

import sys
import logging
import os
from os import path

import requests
from prudentia import __version__ as v


def set_terminal_size():
    if sys.stdin.isatty():
        rows, columns = os.popen('stty size', 'r').read().split()
        os.environ['COLUMNS'] = columns


def init_user_dir():
    os.environ['PRUDENTIA_USER_DIR'] = user_dir = path.join(path.expanduser('~'), 'prudentia')
    if not path.exists(user_dir):
        os.makedirs(user_dir)
    return user_dir


def init_logging(user_dir):
    logging.basicConfig(
        filename=path.join(user_dir, 'cli.log'),
        format='%(asctime)s.%(msecs).03d [%(name)s] %(levelname)s: %(message)s',
        datefmt='%d-%m-%Y %H:%M:%S',
        level=logging.WARNING
    )


def init_readline(user_dir):
    import readline
    import atexit

    if 'libedit' in readline.__doc__:
        readline.parse_and_bind("bind ^I rl_complete")
    else:
        readline.parse_and_bind("tab: complete")

    history_path = path.join(user_dir, 'history')

    def save_history(p=history_path):
        import readline
        readline.write_history_file(p)

    try:
        readline.read_history_file(history_path)
    except:
        pass

    atexit.register(save_history)


def check_latest():
    url = "https://pypi.python.org/pypi/prudentia/json"
    try:
        pkg_info = requests.get(url, timeout=0.5).json()
        last = pkg_info['info']['version']
        if v != last:
            print '\nVersions mismatch: the latest release is {0}, currently running {1}.\n' \
                  'Consider upgrading Prudentia (e.g. $ pip install -U prudentia).\n'.format(last, v)
    except:
        pass


if __name__ == "__main__":
    set_terminal_size()
    ud = init_user_dir()
    init_logging(ud)
    init_readline(ud)
    check_latest()

    from prudentia.cli import CLI

    cli = CLI()

    exit_error = 1
    args = cli.parse()
    try:
        exit_error = 0 if cli.run(args) else 1
    except Exception, e:
        logging.exception('Error during run.')
        print '\nError during run: %s\n' % e

    sys.exit(exit_error)
