#!/usr/bin/env python
"""
cath-funfhmmer-api - search sequence against CATH FunFams
"""

# core
import argparse
import logging

# local
from cathpy.core.funfhmmer import Client

parser = argparse.ArgumentParser(
    description="Search a protein sequence against CATH FunFams.",
    formatter_class=argparse.ArgumentDefaultsHelpFormatter)

parser.add_argument('--in', '-i', type=str, dest='in_file', required=True,
                    help='query protein sequence (FASTA format)')

parser.add_argument('--sleep', '-s', type=int, default=2,
                    help='seconds to wait between result checks')

parser.add_argument('--maxretries', type=int, default=50,
                    help='maximum number of times to retry before giving up')

parser.add_argument('--format', '-f', type=str, default='csv',
                    help='output format')

parser.add_argument('--out', '-o', type=str, dest='out_file', required=False,
                    help='output file')

parser.add_argument('--allhits', '-a', type=bool, dest='all_hits', action='store_true', default=False,
                    help='show all hits (default: resolved hits)')

parser.add_argument('--verbose', '-v', required=False, action='count', default=0,
                    help='more verbose logging')

if __name__ == '__main__':
    args = parser.parse_args()

    log_level = logging.DEBUG if args.verbose > 0 else logging.INFO
    logging.basicConfig(level=log_level)
    logger = logging.getLogger(__name__)

    fasta_file = args.in_file
    with open(fasta_file, 'r') as f:
        fasta = f.read()

    client = Client(sleep=args.sleep, retries=args.maxretries)
    results = client.search_fasta(fasta=fasta)

    logger.info('Printing results...')
    results_out = ''
    scan = results.funfam_scan if args.all_hits else results.funfam_resolved_scan
    if args.format == 'json':
        results_out = scan.as_json()
    elif args.format == 'tsv':
        results_out = scan.as_tsv()
    else:
        raise Exception('unknown format {}'.format(format))

    if args.out_file:
        with open(args.out_file, 'w') as output:
            output.write(results_out.encode('utf-8'))
    else:
        print(results_out)
