#!/usr/bin/env python3

import argparse
import pandas as pd
import numpy as np
import json
import sys
import os
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import logging

from miner import miner, util
from miner import GIT_SHA, __version__ as pkg_version
from miner import subtypes, bcmembers


DESCRIPTION = """miner3-subtypes - MINER compute sample subtypes
MINER Version %s (Git SHA %s)""" % (pkg_version, GIT_SHA.replace('$Id: ', '').replace(' $', ''))

MIN_CORRELATION = 0.2

LOG_FORMAT = '%(asctime)s %(message)s'
DATE_FORMAT = '%Y-%m-%d %H:%M:%S \t'

if __name__ == '__main__':
    stream_handler = logging.StreamHandler(sys.stdout)
    stream_handler.setFormatter(logging.Formatter(LOG_FORMAT, DATE_FORMAT))
    LOGGER = logging.getLogger()
    LOGGER.addHandler(stream_handler)
    LOGGER.setLevel(logging.INFO)

    parser = argparse.ArgumentParser(formatter_class=argparse.RawDescriptionHelpFormatter,
                                     description=DESCRIPTION)
    parser.add_argument('expfile', help="input matrix")
    parser.add_argument('mapfile', help="identifier mapping file")
    parser.add_argument('regulons', help="regulons.json file from miner-mechinf")
    parser.add_argument('outdir', help="output directory")
    parser.add_argument('--skip_tpm', action="store_true",
                        help="overexpression threshold")

    args = parser.parse_args()

    if not os.path.exists(args.regulons):
        sys.exit("regulons file not found")

    if not os.path.exists(args.outdir):
        os.makedirs(args.outdir)

    with open(os.path.join(args.outdir, 'run_info.txt'), 'w') as outfile:
        util.write_dependency_infos(outfile)

    LOGGER.info('load and setup data')
    exp_data, conv_table = miner.preprocess(args.expfile, args.mapfile, do_preprocess_tpm=(not args.skip_tpm))
    with open(args.regulons) as infile:
        regulon_modules = json.load(infile)

    bcmembers.bcmembers(exp_data, regulon_modules, args.outdir)
    subtypes.subtypes(exp_data, regulon_modules, args.outdir)
