#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
import sys
import argparse
import gbrs


logo_text = """
        _
       | |
   __ _| |__  _ __ ___
  / _` | '_ \| '__/ __|
 | (_| | |_) | |  \__ \\
  \__, |_.__/|_|  |___/
   __/ |
  |___/     Ver.:%s

""" % gbrs.__version__


#
# Subcommand: hybridize
#
def add_subcommand_hybridize(subparsers):
    subparser_hyb = subparsers.add_parser('hybridize')
    subparser_hyb.add_argument('-F', '--target-files',  action='store', dest='fastalist', type=str, required=True)
    subparser_hyb.add_argument('-s', '--suffices', action='store', dest='haplist', type=str, required=True)
    subparser_hyb.add_argument('-o', action='store', dest='outfile', type=str, default='gbrs.hybridized.targets.fa')
    subparser_hyb.add_argument('--build-bowtie-index', action='store_true', dest='build_bowtie_index')
    subparser_hyb.set_defaults(func=gbrs.emase_utils.hybridize)


#
# Subcommand: align
#
def add_subcommand_align(subparsers):
    subparser_aln = subparsers.add_parser('align')
    subparser_aln.set_defaults(func=gbrs.emase_utils.align)


#
# Subcommand: bam2emase
#
def add_subcommand_bam2emase(subparsers):
    subparser_b2e = subparsers.add_parser('bam2emase')
    subparser_b2e.add_argument('-i', '--bamfile', action='store', dest='alnfile', type=str, required=True)
    subparser_b2e.add_argument('-m', '--locus-ids', action='store', dest='lidfile', type=str, default=None)
    subparser_b2e.add_argument('-s', '--haplotype-codes', action='store', dest='haplogypes', type=str, required=True)
    subparser_b2e.add_argument('-o', action='store', dest='outfile', type=str, default=None)
    subparser_b2e.add_argument('--index-dtype', action='store', dest='index_dtype', type=str, default='uint32')
    subparser_b2e.add_argument('--data-dtype', action='store', dest='data_dtype', type=str, default='uint8')
    subparser_b2e.set_defaults(func=gbrs.emase_utils.bam2emase)


#
# Subcommand: intersect
#
def add_subcommand_intersect(subparsers):
    subparser_isect = subparsers.add_parser('intersect')
    subparser_isect.add_argument('-i', '--emase-files', action='store', dest='emasefiles', type=str, required=True)
    subparser_isect.add_argument('-o', action='store', dest='outfile', type=str, required=True)
    subparser_isect.add_argument('-c', action='store', dest='complib', type=str, default='zlib')
    subparser_isect.set_defaults(func=gbrs.emase_utils.intersect)


#
# Subcommand: emase2ec
#
def add_subcommand_compress(subparsers):
    subparser_press = subparsers.add_parser('compress')
    subparser_press.add_argument('-i', '--emase-files', action='store', dest='emasefiles', type=str, required=True)
    subparser_press.add_argument('-o', action='store', dest='outfile', type=str, required=True)
    subparser_press.add_argument('-c', action='store', dest='complib', type=str, default='zlib')
    subparser_press.set_defaults(func=gbrs.emase_utils.compress)


#
# Subcommand: quantify
#
def add_subcommand_quantify(subparsers):
    subparser_quan = subparsers.add_parser('quantify')
    subparser_quan.add_argument('-i', '--alignment-file', action='store', dest='alnfile', type=str, required=True)
    subparser_quan.add_argument('-g', '--group-file', action='store', dest='grpfile', type=str, required=True)
    subparser_quan.add_argument('-L', '--length-file', action='store', dest='lenfile', type=str, default=None)
    subparser_quan.add_argument('-G', '--genotype', action='store', dest='gtypefile', type=str, default=None)
    subparser_quan.add_argument('-M', '--multiread-model', action='store', dest='multiread_model', type=int, default=4)
    subparser_quan.add_argument('-o', action='store', dest='outbase', type=str, default='gbrs.quantified')
    subparser_quan.add_argument('-p', '--pseudocount', action='store', dest='pseudocount', type=float, default=0.0)
    subparser_quan.add_argument('-r', '--read-length', action='store', dest='read_length', type=int, default=100)
    subparser_quan.add_argument('-m', '--max-iters', action='store', dest='max_iters', type=int, default=999)
    subparser_quan.add_argument('-t', '--tolerance', action='store', dest='tolerance', type=float, default=0.0001)
    subparser_quan.add_argument('-a', '--report-alignment-counts', action='store_true', dest='report_alignment_counts')
    subparser_quan.add_argument('-w', '--report-posterior', action='store_true', dest='report_posterior')
    subparser_quan.set_defaults(func=gbrs.emase_utils.quantify)


#
# Subcommand: stencil
#
def add_subcommand_stencil(subparsers):
    subparser_stenc = subparsers.add_parser('stencil')
    subparser_stenc.add_argument('-i', action='store', dest='alnfile', type=str, required=True)
    subparser_stenc.add_argument('-G', '--genotype', action='store', dest='gtypefile', type=str, required=True)
    subparser_stenc.add_argument('-g', action='store', dest='grpfile', type=str, default=None)
    subparser_stenc.add_argument('-o', action='store', dest='outfile', type=str, default=None)
    subparser_stenc.set_defaults(func=gbrs.emase_utils.stencil)


#
# Subcommand: reconstruct
#
def add_subcommand_reconstruct(subparsers):
    subparser_rec = subparsers.add_parser('reconstruct')
    subparser_rec.add_argument('-e', action='store', dest='exprfile', type=str, required=True)
    subparser_rec.add_argument('-t', action='store', dest='tprobfile', type=str, required=True)
    subparser_rec.add_argument('-x', action='store', dest='avecfile', type=str, default=None)
    subparser_rec.add_argument('-g', action='store', dest='gposfile', type=str, default=None)
    subparser_rec.add_argument('-c', action='store', dest='expr_threshold', type=float, default=1.5)
    subparser_rec.add_argument('-s', action='store', dest='sigma', type=float, default=0.12)
    subparser_rec.add_argument('-o', action='store', dest='outbase', type=str, default=None)
    subparser_rec.set_defaults(func=gbrs.commands.reconstruct)


#
# Subcommand: interpolate
#
def add_subcommand_interpolate(subparsers):
    subparser_interp = subparsers.add_parser('interpolate')
    subparser_interp.add_argument('-i', action='store', dest='probfile', type=str, required=True)
    subparser_interp.add_argument('-g', action='store', dest='gridfile', type=str, default=None)
    subparser_interp.add_argument('-p', action='store', dest='gposfile', type=str, default=None)
    subparser_interp.add_argument('-o', action='store', dest='outfile', type=str, default=None)
    subparser_interp.set_defaults(func=gbrs.commands.interpolate)


#
# Subcommand: combine
#
def add_subcommand_combine(subparsers):
    subparser_comb = subparsers.add_parser('combine')
    subparser_comb.add_argument('-i', '--genoprob-files', action='store', dest='probfiles', type=str, required=True)
    subparser_comb.add_argument('-o', action='store', dest='outfile', type=str, default=None)
    subparser_comb.set_defaults(func=gbrs.commands.combine)


#
# Subcommand: plot
#
def add_subcommand_plot(subparsers):
    subparser_plot = subparsers.add_parser('plot')
    subparser_plot.add_argument('-i', '--genoprob', action='store', dest='gpbfile', type=str, required=True)
    subparser_plot.add_argument('-o', '--outfile', action='store', dest='outfile', type=str, default=None)
    subparser_plot.add_argument('-n', '--sample-name', action='store', dest='sample_name', type=str, default='')
    subparser_plot.add_argument('--num-grids', action='store', dest='grid_size', type=int, default=42586)
    subparser_plot.add_argument('--xt-max', action='store', dest='xt_max', type=int, default=4501)
    subparser_plot.add_argument('--xt-size', action='store', dest='xt_size', type=int, default=475)
    subparser_plot.add_argument('--grid-width', action='store', dest='width', type=float, default=0.01)
    subparser_plot.set_defaults(func=gbrs.commands.plot)


def main():

    #
    # Main command parser
    #

    parser = argparse.ArgumentParser(version=gbrs.__version__)
    subparsers = parser.add_subparsers(dest='action')

    #
    # Add sub-commands
    #
    add_subcommand_hybridize(subparsers)
    add_subcommand_align(subparsers)
    add_subcommand_bam2emase(subparsers)
    add_subcommand_intersect(subparsers)
    add_subcommand_compress(subparsers)
    add_subcommand_quantify(subparsers)
    add_subcommand_reconstruct(subparsers)
    add_subcommand_stencil(subparsers)
    add_subcommand_interpolate(subparsers)
    add_subcommand_combine(subparsers)
    add_subcommand_plot(subparsers)

    #
    # Execute command
    #
    args = parser.parse_args()
    if args.action is None:
        parser.print_help()
    else:
        kws = dict(vars(args))
        args.func(**kws)


if __name__ == "__main__":
    sys.exit(main())
