#!/usr/bin/env python

import argparse
import math
import sys

from treeCl.alignment import Alignment
from treeCl.utils import fileIO
from treeCl.errors import filecheck, directorymake, optioncheck


def bootstrap(filename, directory, n=100, file_format='fasta'):
    """
    bootstrap:  
        takes a sequence alignment file and makes n bootstrap
        replicates by sampling with replacement from the columns

    parameters:
        filename = alignment file
        directory = output directory
        n = number of replicates to make
    """

    al = Alignment(filename, file_format)
    # al.name = get_prefix(filename)
    nfigures = int(math.ceil(math.log10(n + 1)))
    for i in range(n):
        sample_name = '{0}_{1:0>{2}}.phy'.format(al.name, i + 1, nfigures)
        boot = al.bootstrap()
        boot.write_alignment('{0}/{1}'.format(directory, sample_name), file_format,
                          interleaved=True)
    print '{0} files written to {1}'.format(n, directory)


def parse_args():
    prog = fileIO.basename(sys.argv[0])
    desc = '{0}: Makes bootstrap samples from sequence alignments'.format(
        prog.upper())
    f_choices = ['fasta', 'phylip']
    i_help = 'Input filename'
    d_help = 'Output directory (will create if doesn\'t exist)'
    f_help = 'Input file format [fasta/phylip] (default=fasta)'
    n_help = 'Number of samples to write (default=100)'

    parser = argparse.ArgumentParser(prog=prog, description=desc)
    parser.add_argument('infile', type=str, help=i_help)
    parser.add_argument('directory', type=str, help=d_help)
    parser.add_argument('-f', '--file-format', type=str, default='fasta',
                        choices=f_choices, help=f_help)
    parser.add_argument('-n', '--number', type=int, default=100, help=n_help)

    return parser.parse_args()


def check_args(args):
    filecheck(args.infile)
    directorymake(args.directory)
    optioncheck(args.file_format, ['fasta', 'phylip'])
    assert args.number > 0

    return args


def get_prefix(filename):
    base = fileIO.basename(filename)
    try:
        dot_position = base.index('.')
    except ValueError:  # no dot found
        dot_position = len(base)

    return base[:dot_position]


def main():
    args = check_args(parse_args())
    bootstrap(args.infile, args.directory, args.number,
              args.file_format)


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