#!/usr/bin/env python

from argparse import ArgumentParser
from wos.utils import query, doi_to_wos
from wos import WosClient

import traceback
import logging
import suds
import sys

logging.getLogger('suds.client').setLevel(logging.CRITICAL)

def pprint(data):
    """Print unicode string in a compatible way."""
    print(data.encode('utf-8') if sys.version_info[0] < 3 else data)

def main():
    """Main method."""
    parser = ArgumentParser(description='Query the Web of Science.')
    parser.add_argument('--close', action='store_true', help="Close session.")
    parser.add_argument('--proxy', type=str, default=None, help='HTTP proxy')
    parser.add_argument('--timeout', type=int, default=600, help='API timeout')
    parser.add_argument('-l', '--lite', action='store_true', help='Wos Lite')
    parser.add_argument('-v', '--verbose', action='store_true', help='Verbose')
    subparsers = parser.add_subparsers(help='sub-command help')

    g_auth = parser.add_argument_group('authentication',
                                       'API credentials for premium access.')
    g_auth.add_argument('-u', '--user', type=str, default=None)
    g_auth.add_argument('-p', '--password', type=str, default=None)
    g_auth.add_argument('-s', '--sid', type=str, default=None)

    s_query = subparsers.add_parser('query', help='query the Web of Science.')
    s_query.add_argument('QUERY', help='search query')
    s_query.add_argument('-c', '--count', type=int, default=5)
    s_query.add_argument('-o', '--offset', type=int, default=1)
    s_query.add_argument('-m', '--max', type=int, help='entries', default=100)

    s_doi = subparsers.add_parser('doi', help='get the WOS ID from the DOI.')
    s_doi.add_argument('DOI', help='Document Object Identifier')

    subparsers.add_parser('connect', help='connect and get an SID.')

    args = parser.parse_args()

    try:
        with WosClient(args.user, args.password, args.sid, args.close,
                       args.lite, args.proxy, args.timeout) as wc:
            if 'QUERY' in args:
                pprint(query(wc, args.QUERY, '', args.count, args.offset,
                            args.max))
            if 'DOI' in args:
                pprint(doi_to_wos(wc, args.DOI))

    except suds.WebFault as wf:
        if args.verbose:
            traceback.print_exc()
        else:
            pprint(('ERROR: %s' % wf.fault.faultstring))

    except Exception as e:
        if args.verbose:
            traceback.print_exc()
        else:
            pprint(('ERROR: %s' % str(e)))


if __name__ == '__main__':
    main()
