#!python
import argparse

import pypassage
from pypassage import Passage
from biblehub import get_versions, find_verse, search, styling, parse_str, find_passage


def exec_find_passage(query, version):
    try:
        res = find_passage(query, version=version)
        verses = res['verses']
        keys = verses.keys()
        print(styling.format_reference(res['reference'] + ' (%s)' % version.upper()))
        for key in keys:
            print(styling.format_reference(str(key)) + ' ' + res['verses'][key])
    except ValueError:
        print('Value error')
        print('Verse query for ' + ''.join(query) + ' failed')
        exit(1)
    except IndexError:
        print('query for ' + ''.join(query) + ' failed')
        print('Did you type in the reference correctly?\nformat examples: 1 corinthians 1:2, genesis 2:4')
        exit(1)
    except AttributeError:
        print('Passage unable to be parsed, did you type in the reference correctly?')


def exec_find_versions(query):
    versions = get_versions(query, recolor=True)
    print(versions[0]["reference"])
    for version in versions:
        print(version["version"])
        print(version["passage"])
    exit(0)


def exec_find_verse(query, version, lexicon, cr, tr):
    try:
        print(find_verse(query, version=version, get_lexicons=lexicon,
                         get_crfs=cr, get_tsks=tr))
        exit(0)
    except ValueError:
        print('Value error')
        print('Verse query for ' + ''.join(query) + ' failed')
        exit(1)
    except IndexError:
        print('query for ' + ''.join(query) + ' failed')
        print('Did you type in the reference correctly?\nformat examples: 1 corinthians 1:2, genesis 2:4')
        exit(1)
    except AttributeError:
        print('Passage unable to be parsed, did you type in the reference correctly?')


def exec_search(query, search_filter):
    query_results = search(query, search_filter=search_filter)
    for item in query_results:
        print(styling.format_reference(item["reference"]))
        print(item["preview"])
        print(item["excerpt"])


def run(args):
    args.query = ' '.join(args.query)
    if args.command == 'find':
        verse = parse_str(args.query)
        try:
            parsed_book = Passage(book=verse['book'])
            print(parsed_book.__str__())
            if parsed_book.__str__().lower() == 'psalms':
                raise pypassage.InvalidPassageException
            parsed_passage = Passage(book=verse['book'], start_chapter=verse['chapter'],
                         start_verse=verse['start_verse'],
                         end_verse=verse['end_verse'])
            args.query = parsed_passage.__str__()
        except pypassage.InvalidPassageException:
            pass
        if args.versions:
            exec_find_versions(args.query)

        # Find passage
        elif ':' not in args.query or '-' in args.query:
            exec_find_passage(args.query, args.version)
        else:
            exec_find_verse(args.query, args.version, args.all | args.l,
                            args.all | args.c, args.all | args.t)
    elif args.command == 'search':
        search_filter = ''
        if args.nt:
            search_filter = 'nt'
        elif args.ot:
            search_filter = 'ot'
        exec_search(args.query, search_filter)


def main():
    parser = argparse.ArgumentParser(description='Query Biblehub.com and retrieve the verse.'
                                                 'Use the flag -a to fetch all available information on the reference')
    subparsers = parser.add_subparsers(dest='command')
    find_verse = subparsers.add_parser('find')
    search_verses = subparsers.add_parser('search')

    # find command
    find_verse.add_argument('query', nargs='+', type=str, help='The Bible Reference to retrieve. Only Book #:# format '
                                                               'accepted. (i.e Genesis 1:1, case insensitive)')
    find_verse.add_argument('-v', '--version', nargs='?', default='niv',
                            help='The version of the bible to be retrieved, '
                                 'Defaults to NIV')
    find_verse.add_argument('-c', '--cross-refs', dest='c', action='store_true', help='Fetch the cross references')
    find_verse.add_argument('-t', '--treasury-scripture', dest='t', action='store_true',
                            help='Fetch the treasury of scripture')
    find_verse.add_argument('-l', '--lexicon', dest='l', action='store_true', help='Fetch the lexicon')
    find_verse.add_argument('-a', '--all', action='store_true', help='Fetch all available information on scripture')
    find_verse.add_argument('--versions', dest='versions', action='store_true', help='Fetch all available versions')

    # search command
    search_verses.add_argument('query', nargs='+', type=str, help='The key words to query biblehub.com for')
    search_verses.add_argument('--ot', '--old-testament', dest='ot', action='store_true',
                               help='Restrict search to the old testament')
    search_verses.add_argument('--nt', '--new-testament', dest='nt', action='store_true',
                               help='Restrict search to the new testament')
    args = parser.parse_args()
    run(args)


if __name__ == "__main__":
    main()
