#!/opt/conda/conda-bld/anvio-minimal_1585951738899/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold/bin/python
# -*- coding: utf-8

"""
Copyright (C) 2015, anvio Authors

This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 2 of the License, or (at your option)
any later version.

Please read the COPYING file.
"""

__description__ = "A simple script to generate info from search tables"

import sys
import argparse

import anvio.tables as t
import anvio.dbops as dbops
import anvio.terminal as terminal


run = terminal.Run()
progress = terminal.Progress()

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description=__description__)
    parser.add_argument('contigs_db', metavar = 'CONTIGS_DB',
                        help = 'Contigs database to read from.')
    parser.add_argument('--list-sources', action='store_true', default=False,
                        help = 'Show available single-copy gene search results and exit.')
    parser.add_argument('--source', default=None,
                        help = 'Source to focus on. If none declared, all single-copy gene sources\
                                are going to be listed.')

    args, unknown = parser.parse_known_args()

    contigs = set([])
    contig_lengths = {}
    contig_genes = {}
    genes = {}

    db = dbops.ContigsDatabase(args.contigs_db, quiet=False)
    search_contigs_dict = db.db.get_table_as_dict(t.hmm_hits_table_name)
    genes_in_contigs_dict = db.db.get_table_as_dict(t.genes_in_contigs_table_name)
    search_info_dict = db.db.get_table_as_dict(t.hmm_hits_info_table_name)
    contig_lengths_table = db.db.get_table_as_dict(t.contigs_info_table_name)
    contig_lengths = dict([(c, contig_lengths_table[c]['length']) for c in contig_lengths_table])
    db.disconnect()

    sources = {}
    irrelevant_sources = []
    for source in search_info_dict:
        if search_info_dict[source]['search_type'] == "singlecopy":
            sources[source] = [g.strip() for g in search_info_dict[source]['genes'].split(',')]
        else:
            irrelevant_sources.append(source)

    irrelevant_entries = set([])
    for source in irrelevant_sources:
        for entry in search_contigs_dict:
            if search_contigs_dict[entry]['source'] in irrelevant_sources:
                irrelevant_entries.add(entry)

    for entry in irrelevant_entries:
        search_contigs_dict.pop(entry)

    if args.list_sources:
        print((list(sources.keys())))
        sys.exit()

    if args.source:
        if args.source not in sources:
            print(('bad --source. here are the available ones: %s' % ', '.join(sources)))
        else:
            sources = {args.source: sources[source]}

    hits_output = open(args.contigs_db + '.hits', 'w')
    hits_output.write('source\tcontig\tgene\te_value\n')
    for entry in list(search_contigs_dict.values()):
        contig_name = genes_in_contigs_dict[entry['gene_callers_id']]['contig']
        hits_output.write('%s\t%s\t%s\t%.4g\n' % (entry['source'], contig_name, entry['gene_name'], entry['e_value'] ))
    hits_output.close()

    genes_output = open(args.contigs_db + '.genes', 'w')
    genes_output.write('source\tgene\n')
    for source in sources:
        for gene in sources[source]:
            genes_output.write('%s\t%s\n' % (source, gene))
    genes_output.close()

    #for e in es:
    #    print
    #    print '##################################################'
    #    print e
    #    print '##################################################'
    #    print
    #    for contig in contigs:
    #        if contig_genes[e].has_key(contig) and len(contig_genes[e][contig]):
    #            print contig, contig_lengths[contig], len(contig_genes[e][contig])
    #    print
