#!/usr/bin/env python

import os
import sys
import argparse
import subprocess
import PanChIP.commands as commands
from PanChIP.version import __version__

lib_name = 'v.3.0'

def remove_prefix(input_string, prefix):
    if prefix and input_string.startswith(prefix):
        return input_string[len(prefix):]
    return input_string

def remove_suffix(input_string, suffix):
    if suffix and input_string.endswith(suffix):
        return input_string[:-len(suffix)]
    return input_string

class Panchip(object):

    def __init__(self):
        parser = commands.panchip_parser()

        option_ix = 1
        while (option_ix < len(sys.argv) and
               sys.argv[option_ix].startswith('-')):
            option_ix += 1
                
        args = parser.parse_args(sys.argv[1:option_ix+1])
        
        if args.command is None or not hasattr(self, args.command):
            print('Unrecognized command')
            parser.print_help()
            exit(1)
        
        command = " ".join(sys.argv)
        
        import PanChIP
        
        getattr(self, args.command)([sys.argv[0]] + sys.argv[option_ix:])
            
    def init(self, argv):
        parser = commands.init_parser()

        args = parser.parse_args(argv[2:])

        lib_dir = os.path.abspath(args.library_directory)
        os.makedirs(lib_dir, exist_ok = True)
        
        import gdown
        
        lib_zip_path = lib_dir + '/' + lib_name + '.zip'
        
        subprocess.call(['gdown', '-O', lib_zip_path, 'https://drive.google.com/uc?id=17L0c1pv8dx2906O7WMfWwcqgDLMJyq7T&confirm=t'])
        
        import zipfile
        
        with zipfile.ZipFile(lib_zip_path,'r') as zip_ref:
            zip_ref.extractall(lib_dir)
            
        subprocess.call(['rm', lib_zip_path])
        
        link = 'https://github.com/hanjunlee21/PanChIP/archive/refs/tags/v.' + __version__ + '.tar.gz'
        tar_gz_path = lib_dir + '/v.' + __version__ + '.tar.gz'
        subprocess.call(['wget', '-O', tar_gz_path, link])
        subprocess.call(['tar', '-C', lib_dir, '-x', '-v', '-z', '-f', tar_gz_path])
        subprocess.call(['rm', tar_gz_path])
        
    def analysis(self, argv):
        parser = commands.analysis_parser()

        args = parser.parse_args(argv[2:])
        
        lib_dir = os.path.abspath(args.library_directory + '/Analysis')
        input_dir = os.path.abspath(args.input_directory)
        output_dir = os.path.abspath(args.output_directory)
        thread = str(args.threads)
        repeat = str(args.repeats)
        
        os.makedirs(output_dir, exist_ok = True)
        
        f = open(output_dir + '/bedfiles.sh','w+')
        f.write('#!/bin/bash\nls ' + input_dir + ' | awk \'{printf "%s ", $1}\' | sed \'s/.bed//g\' > ' + output_dir + '/bedfiles.txt')
        f.close()
        
        subprocess.call(['sh', output_dir + '/bedfiles.sh'])
        
        input_list = open(output_dir + '/bedfiles.txt', 'r').read().rstrip()
        subprocess.call(['rm', output_dir + '/bedfiles.sh'])
        subprocess.call(['rm', output_dir + '/bedfiles.txt'])
        
        f = open(output_dir + '/executable.sh','w+')
        f.write('#!/bin/bash\n\ninputfiles="' + input_list + '"\ninput="' + input_dir + '"\noutput="' + output_dir + '"\nlib="' + os.path.abspath(args.library_directory) + '/' + lib_name + '/Analysis"\nthreads="' + thread + '"\nrepeat="' + repeat + '"\n\n')
        
        with open(os.path.abspath(args.library_directory) + '/PanChIP-v.' + __version__ + '/PanChIP/analysis.sh') as infile:
            for line in infile:
                f.write(line)
                
        f.close()
        
        f = open(output_dir + '/analysis.sh','w+')
        f.write('#!/bin/bash\n\ncd ' + output_dir + '\nchmod u+x ./executable.sh\n./executable.sh')
        f.close()
        subprocess.call(['sh', output_dir + '/analysis.sh'])
        
    def filter(self, argv):
        parser = commands.filter_parser()

        args = parser.parse_args(argv[2:])
        
        lib_dir = os.path.abspath(args.library_directory + '/Filter')
        input_dir = os.path.abspath(args.input_file)
        output_dir = os.path.abspath(args.output_directory)
        thread = str(args.threads)
        
        os.makedirs(output_dir, exist_ok = True)
        
        f = open(output_dir + '/executable.sh','w+')
        f.write('#!/bin/bash\n\ninputfiles="' + remove_suffix(remove_prefix(input_dir, os.path.dirname(os.path.abspath(args.input_file)) + '/'), '.bed') + '"\ninput="' + os.path.dirname(os.path.abspath(args.input_file)) + '"\noutput="' + output_dir + '"\nlib="' + os.path.abspath(args.library_directory) + '/' + lib_name + '/Filter"\nthreads="' + thread + '"\n')
        
        with open(os.path.abspath(args.library_directory) + '/PanChIP-v.' + __version__ + '/PanChIP/filter.sh') as infile:
            for line in infile:
                f.write(line)
                
        f.close()
        
        f = open(output_dir + '/filter.sh','w+')
        f.write('#!/bin/bash\n\ncd ' + output_dir + '\nchmod u+x ./executable.sh\n./executable.sh')
        f.close()
        subprocess.call(['sh', output_dir + '/filter.sh'])
        
if __name__ == '__main__':
    Panchip()
