#!/usr/bin/env python
import argparse
import json
import logging
import os.path
import shutil
import sys

try:
    from regsnp_intron.feature_calculator import FeatureCalculator
    from regsnp_intron.predictor.predictor import Predictor
except:
    sys.path.append(os.path.join(os.path.dirname(os.path.realpath(__file__)), '..'))
    from regsnp_intron.feature_calculator import FeatureCalculator
    from regsnp_intron.predictor.predictor import Predictor


def main():
    default_setting_path = os.path.realpath(os.path.join(os.path.dirname(os.path.realpath(__file__)),
                                                         '../regsnp_intron/settings/settings.json'))
    parser = argparse.ArgumentParser(description='''
            Given a list of intronic SNVs, predict the disease-causing probability
            based on genomic and protein structural features.''')
    parser.add_argument('-s', '--sfname',
            default=default_setting_path,
            help='JSON file containing settings. Default setting file locate at: {0}'.
                        format(default_setting_path))
    parser.add_argument('-f', '--force', action='store_true',
            help='overwrite existing directory')
    parser.add_argument('ifname',
            help='input SNV file. Contains four columns: chrom, pos, ref, alt.')
    parser.add_argument('out_dir',
            help='directory contains output files')
    args = parser.parse_args()

    out_dir = os.path.expanduser(args.out_dir)
    if not os.path.exists(out_dir):
        os.mkdir(out_dir)
    elif args.force:
        shutil.rmtree(out_dir, ignore_errors=True)
        os.mkdir(out_dir)
    else:
        sys.stderr.write('Output directory exists: {0}. Use \'-f/--force\' to overwrite.\n'.format(out_dir))
        sys.exit(1)

    logging.basicConfig(format='%(asctime)s - %(levelname)s - %(name)s - %(message)s',
                        level=logging.INFO)
    settings = json.load(open(args.sfname))
    feature_calculator = FeatureCalculator(settings, args.ifname, args.out_dir)
    feature_calculator.calculate_feature()

    db_dir = os.path.expanduser(settings['db_dir'])
    predictor = Predictor(os.path.join(db_dir, 'model', 'on_ss_imp.pkl'),
                          os.path.join(db_dir, 'model', 'off_ss_imp.pkl'),
                          os.path.join(db_dir, 'model', 'on_ss_clf.pkl'),
                          os.path.join(db_dir, 'model', 'off_ss_clf.pkl'))
    predictor.predict(os.path.join(args.out_dir, 'snp.features.txt'), os.path.join(args.out_dir, 'snp.prediction.txt'))

if __name__ == '__main__':
    main()
