#!/usr/bin/env python

from pyPheWAS.pyPhewasCorev2 import display_kwargs,print_start_msg
from pyPheWAS.maximize_bipartite import *
import os
import argparse
from pathlib import Path
import os.path as osp
import time
import math

def parse_args():
    parser = argparse.ArgumentParser(description="pyPheWAS Case/Control Matching Tool")

    parser.add_argument('--input', required=True, type=str, help='Name of the input group file')
    parser.add_argument('--deltas', required=True, type=str, help='Tolerance intervals for matching criteria')
    parser.add_argument('--keys', required=True, type=str, help='Matching criteria (must be columns in group file)')
    parser.add_argument('--goal', required=True, type=int, help='n, indicating the ratio of control to case groups that are being matched')
    parser.add_argument('--output', required=False, default=None, type=str, help='Name of the output group file')
    parser.add_argument('--condition', required=False, default='genotype', type=str, help='Field denoting groups assignments (default = genotype)')
    parser.add_argument('--path', required=False, default='.', type=str, help='Path to all input files and destination of output files (default = current directory)')

    args = parser.parse_args()
    return args

"""
Print Start Message
"""
start = time.time()
print_start_msg()
print('\nmaximizeControls: Case/Control Matching Tool\n')


"""
Retrieve and validate all arguments.
"""
args = parse_args()
kwargs = {'path': Path(args.path),
          'input': args.input,
          'output': args.output,
          'deltas':args.deltas,
          'keys':args.keys,
          'condition':args.condition,
          'goal': int(args.goal)
}

# Assert that valid files were given
assert kwargs['input'].endswith('.csv'), "%s is not a valid input group file, must be a .csv file" % (kwargs['input'])
assert osp.exists(kwargs['path'] / kwargs['input']), "%s does not exist" %(kwargs['path'] / kwargs['input'])

if kwargs['output'] is not None:
    assert kwargs['output'].endswith('.csv'), "%s is not a valid output group file, must be a .csv file" % (kwargs['output'])


# Print Arguments
display_kwargs(kwargs)

"""
Run control matching
"""
control_match(**kwargs)


"""
Calculate runtime
"""
interval = time.time() - start
hour = math.floor(interval/3600.0)
minute = math.floor((interval - hour*3600)/60)
second = math.floor(interval - hour*3600 - minute*60)

if hour > 0:
    time_str = '%dh:%dm:%ds' %(hour,minute,second)
elif minute > 0:
    time_str = '%dm:%ds' % (minute, second)
else:
    time_str = '%ds' % second

print('maximizeControls Complete [Runtime: %s]' %time_str)
