#!/usr/bin/python3
import traceback
import sys

import ilund4u

try:
    parameters = ilund4u.manager.Parameters()
    parameters.parse_cmd_arguments()
    parameters.load_config(parameters.cmd_arguments["config_file"])
    if parameters.args["mode"] == "hotspots":
        proteomes = ilund4u.data_processing.Proteomes(parameters=parameters)
        proteomes.load_sequences_from_extended_gff(input_f=parameters.args["gff"],
                                                   genome_annotation=parameters.args["genome_annotation"])

        if parameters.args["protein_clusters_table"]:
            cluster_to_sequences = proteomes.load_and_process_predefined_protein_clusters(table_path=parameters.args[
                "protein_clusters_table"])
        else:
            mmseqs_clusters = proteomes.mmseqs_cluster()
            cluster_to_sequences = proteomes.process_mmseqs_results(mmseqs_clusters)

        if parameters.args["proteome_communities_table"] or parameters.args["single_proteome_community"]:
            proteomes.load_predefined_proteome_communities(parameters.args["proteome_communities_table"])
        else:
            proteome_network = proteomes.build_proteome_network(cluster_to_sequences)
            proteomes.find_proteome_communities(proteome_network)
        proteomes.define_protein_classes()
        proteomes.annotate_variable_islands()
        island_networks = proteomes.build_islands_network()

        hotspots = proteomes.find_hotspots(island_networks)
        hotspots.pyhmmer_annotation(proteomes)
        hotspots.build_hotspot_network()
        hotspots.calculate_hotspot_and_island_statistics(proteomes)
        hotspots.get_each_protein_group_statistics(proteomes)

        if parameters.args["output_database"]:
            database_manager = ilund4u.data_manager.DatabaseManager(parameters)
            database_manager.build_database(proteomes, hotspots, parameters.args["output_database"])

        drawing_manager = ilund4u.drawing.DrawingManager(proteomes, hotspots, parameters)
        drawing_manager.plot_hotspot_communities(
            shortest_labels=parameters.args["index_only_for_hypothetical_proteins"])
        drawing_manager.plot_proteome_communities()

    elif parameters.args["mode"] == "protein":

        database_manager = ilund4u.data_manager.DatabaseManager(parameters)
        database = database_manager.load_database(db_path=parameters.args["database"])
        if parameters.args["predefined_protein_groups"]:
            with open(parameters.args["predefined_protein_groups"]) as file:
                homologous_groups = [line.strip() for line in file if line.strip()]
            found_hotspots_list = None
        else:
            ps_output = database.protein_search_for_homologues(query_fasta=parameters.args["fa"])
            homologous_groups, names = ps_output["groups"], ps_output["names"]
            found_hotspots_list = ps_output["found_hotspots"]
        for hgi, hg in enumerate(homologous_groups):
            if parameters.args["verbose"]:
                print(f"--- Analysis of {hgi + 1}/{len(homologous_groups)} family homologous to the query ---",
                      file=sys.stdout)
            if parameters.args["predefined_protein_groups"]:
                name = f"r-{hgi+1}_{hg}"
            else:
                name = names[hgi]
            database.protein_search_mode_using_single_homologue(homologous_group=hg, query_fasta=parameters.args["fa"],
                                                                name=name,
                                                                found_hotspots_list=found_hotspots_list,
                                                                query_label=parameters.args["query_label"])
        database.postprocess_protein_search_folder()

    elif parameters.args["mode"] == "proteome":
        database_manager = ilund4u.data_manager.DatabaseManager(parameters)
        database = database_manager.load_database(db_path=parameters.args["database"])
        database.proteome_annotation_mode(query_gff=parameters.args["gff"])

except SystemExit:
    pass
except:
    if parameters.args["debug"]:
        traceback.print_exc()
    else:
        for i in (traceback.format_exc()).split('\n'):
            if "ilund4uError:" in i:
                print(f"✖︎ ilund4uError:{i.split(':')[1]}", file=sys.stderr)
