#!/usr/bin/env python

import sys
import json
import logging
import argparse

try: from urllib import parse as urlparse
except ImportError: # Python 2.x
    import urlparse

import requests

from index import errors
from index.parsers import info
from index.parsers import name
from index.parsers import search
from index.parsers import create
from index.parsers import retrieve
from index.parsers import update
from index.parsers import delete


def setup_logging(log_levels, log_stream, **kwargs):
    '''
    Sets up basic logging.
    '''
    logging.basicConfig(
        level=min(log_levels),
        stream=log_stream,
    )


def not_implemented(*args, **kwargs):
    '''
    Simply raises a NotImplementedError.
    '''
    raise NotImplementedError('this feature has not been implemented')


if __name__ == '__main__':

    parser = argparse.ArgumentParser()

    parser.set_defaults(log_levels=[logging.ERROR])

    parser.add_argument('--debug',
        action='append_const',
        dest='log_levels',
        const=logging.DEBUG,
        help='enable debugging logs',
    )

    parser.add_argument('--verbose',
        action='append_const',
        dest='log_levels',
        const=logging.INFO,
        help='enable verbose logs',
    )

    parser.add_argument('--log',
        dest='log_stream',
        metavar='LOGFILE',
        type=argparse.FileType('a'),
        default=sys.stdout,
        help='target log file',
    )

    parser.add_argument('--host',
        default='localhost',
        help='indexd server host [localhost]',
    )

    parser.add_argument('--port',
        default=8080,
        type=int,
        help='indexd server port [8080]',
    )

    # Add index and alias sub-commands.
    subparsers = parser.add_subparsers(
        title='commands',
        dest='command',
    )
    subparsers.required = True

    info_subparser = subparsers.add_parser('info',
        help='retrieve information by name',
    )
    info_subparser.set_defaults(func=not_implemented)
    info.config(info_subparser)

    name_subparser = subparsers.add_parser('name',
        help='create or update a name with information',
    )
    name_subparser.set_defaults(func=not_implemented)
    name.config(name_subparser)

    search_subparser = subparsers.add_parser('search',
        help='search for records',
    )
    search_subparser.set_defaults(func=not_implemented)
    search.config(search_subparser)

    create_subparser = subparsers.add_parser('create',
        help='create a record',
    )
    create_subparser.set_defaults(func=not_implemented)
    create.config(create_subparser)

    retrieve_subparser = subparsers.add_parser('retrieve',
        help='retrieve a record',
    )
    retrieve_subparser.set_defaults(func=not_implemented)
    retrieve.config(retrieve_subparser)

    update_subparser = subparsers.add_parser('update',
        help='update a record',
    )
    update_subparser.set_defaults(func=not_implemented)
    update.config(update_subparser)

    delete_subparser = subparsers.add_parser('delete',
        help='delete a record',
    )
    delete_subparser.set_defaults(func=not_implemented)
    delete.config(delete_subparser)

    # Parse command line arguments and set up for execution.
    args = parser.parse_args()

    setup_logging(**args.__dict__)

    logging.debug(args)

    # Grab whatever function has been declared for use and pass it everything.
    try: args.__dict__.pop('func')(**args.__dict__)
    except errors.BaseIndexError as err:
        status = err.code
        reason = str(err)
        logging.error('{status}:{reason}'.format(status=status, reason=reason))
        sys.exit(1)
    except requests.exceptions.ConnectionError as err:
        logging.error('{reason}'.format(reason='connection error'))
        sys.exit(1)
