from .. import pretty
from .. import repo
from .. import color
from . import helpers
from ..configs import config
from ..uis import get_ui


def parser(subparsers):
    parser = subparsers.add_parser('list', help="list papers")
    parser.add_argument('-k', '--citekeys-only', action='store_true',
            default=False, dest='citekeys',
            help='Only returns citekeys of matching papers.')
    parser.add_argument('query', nargs='*',
            help='Paper query (e.g. "year: 2000" or "tags: math")')
    return parser


def command(args):

    ui = get_ui()
    citekeys = args.citekeys
    query = args.query

    rp = repo.Repository(config())
    papers = [(n, p) for n, p in enumerate(rp.all_papers())
              if test_paper(query, p)]
    ui.print_('\n'.join(helpers.paper_oneliner(p, n = n, citekey_only = citekeys) for n, p in papers))


# TODO author is not implemented, should we do it by last name only or more
# complex
# TODO implement search by type of document
def test_paper(query_string, p):
    for test in query_string:
        tmp = test.split(':')
        if len(tmp) != 2:
            raise ValueError('command not valid')

        field = tmp[0]
        value = tmp[1]

        if field in ['tags', 't']:
            if value not in p.tags:
                return False
        elif field in ['author', 'authors', 'a']:  # that is the very ugly
            if not 'author' in p.bibentry.persons:
                return False
            a = False
            for p in p.bibentry.persons['author']:
                if value in p.last()[0]:
                    a = True
            return a
        elif field in p.bibentry.fields:
                if value not in p.bibentry.fields[field]:
                    return False
        else:
            return False
    return True