#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
from argparse import ArgumentParser, RawTextHelpFormatter
from kicadsearch import KicadsrchConfig, KicadSearcher

class SearchArgumentParser(ArgumentParser):
    """Freetext searching in KiCad EDA component libraries\n
Search in t[ype], n[ame](default), k[eyword], d[escr] fields"""

    def __init__(self):
        ArgumentParser.__init__(self,
                                description=SearchArgumentParser.__doc__,
                                formatter_class=RawTextHelpFormatter)
        self.add_argument(dest='query', metavar='query', nargs='?')
        self.add_argument('-P',
                          '--print-index-info',
                          dest='print_index_info',
                          action='store_true',
                          help='print index information')
        self.add_argument('-L',
                          '--list-all',
                          dest='list_all',
                          action='store_true',
                          help='list all documents')
        self.add_argument('-C',
                          '--dump-config',
                          dest='dump_config',
                          action='store_true',
                          help='dump configuration options')
        self.add_argument('-c',
                          '--config',
                          dest='config_file',
                          metavar='file',
                          help='alternative configuration file')
        self.add_argument('-l',
                          '--limit',
                          dest='limit_hits',
                          metavar='hits',
                          help='limit number of hits')
        self.add_argument('-a',
                          '--any-match',
                          dest='any_match',
                          action='store_true',
                          help='match any value in name, keyword, descr fields')
        self.add_argument('-t',
                          '--type',
                          dest='search_type',
                          choices=['lib', 'mod', 'kmod'],
                          help='restrict search by a given type')
        self.add_argument('-d',
                          '--dump',
                          dest='dump_content',
                          action='store_true',
                          help='dump document content')

    def parse_args(self):
        args = ArgumentParser.parse_args(self)
        if not args.limit_hits:
            args.limit_hits = sys.maxsize
        return args


if __name__ == '__main__':
    argparser = SearchArgumentParser()
    args = argparser.parse_args()
    try:
        ks = None
        config = KicadsrchConfig(args.config_file)
        if args.dump_config:
            config.dump_items('default', 'search')
        else:
            ks = KicadSearcher(config.get('default', 'indexdir'))
            if args.print_index_info:
                ks.print_index_statistics()
            elif args.list_all:
                ks.list_all(args.dump_content)
            elif args.query:
                ks.search(args.query,
                          int(args.limit_hits),
                          args.any_match,
                          args.search_type,
                          args.dump_content)
            else:
                argparser.print_help()
    except Exception as e:
        print('Error:', e)
    finally:
        if ks:
            ks.close()
