#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Copyright (C) 2015, A. Murat Eren
#
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free
# Software Foundation; either version 2 of the License, or (at your option)
# any later version.
#
# Please read the COPYING file.

import os
import sys
import argparse
import IlluminaUtils.utils.helperfunctions as h
import IlluminaUtils.utils.terminal as terminal

run = terminal.Run()
progress = terminal.Progress()

general_section = '''[general]
project_name = %(project_name)s
researcher_email = %(e_mail)s
input_directory = %(input_dir)s
output_directory = %(output_dir)s\n\n'''

files_section = '''[files]
pair_1 = %(read_1)s
pair_2 = %(read_2)s\n\n'''

prefixes_section = '''
[prefixes]
%(prefix_text)s
'''

class ConfigGenerator:
    def __init__(self, args):
        self.args = args
        self.report = h.get_TAB_delimited_file_as_dictionary(args.report)
        self.input_dir = os.path.dirname(os.path.abspath(args.report))
        self.output_dir = os.path.abspath(args.output_dir) if args.output_dir else self.input_dir
        self.r1_prefix = args.r1_prefix
        self.r2_prefix = args.r2_prefix
        self.e_mail = args.e_mail

        run.info('Report', 'Read for %d samples is read' % len(self.report))
        run.info('Input directory set in configs', self.input_dir)
        run.info('Output directory set in configs', self.output_dir)
        run.info('Prefix for R1', self.r1_prefix)
        run.info('Prefix for R2', self.r2_prefix)


    def _run(self):
        progress.new('Generating config files')
        for sample in self.report:
            progress.update('%s ...' % sample)
            ini = open(os.path.join(self.output_dir, sample + '.ini'), 'w')
            ini.write(general_section % {'project_name': sample,
                                         'e_mail': self.e_mail,
                                         'input_dir': self.input_dir,
                                         'output_dir': self.output_dir})

            ini.write(files_section % {'read_1': self.report[sample]['r1'],
                                       'read_2': self.report[sample]['r2']})

            prefix_text = ''
            if self.r1_prefix:
                prefix_text += 'pair_1_prefix = %s\n' % self.r1_prefix
            if self.r2_prefix:
                prefix_text += 'pair_2_prefix = %s\n' % self.r2_prefix
            if len(prefix_text):
                ini.write(prefixes_section % {'prefix_text': prefix_text})

            ini.close()

        progress.end()

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='Generate config files for demultiplexed FASTQ files')
    # FIXME: it should be possible to run this without the runinfo-dict.
    parser.add_argument('report', metavar = 'FILE',
                        help = 'Report file generated by iu-demultiplex script')
    parser.add_argument('--r1-prefix', metavar = 'REGEXP', default = None,
                        help = 'Prefix for Read 1')
    parser.add_argument('--r2-prefix', metavar = 'REGEXP', default = None,
                        help = 'Prefix for Read 2.')
    parser.add_argument('--e-mail', metavar = 'E-MAIL', default = 'u@example.edu',
                        help = 'E-mail address (currently is not used for anything)')
    parser.add_argument('-o', '--output-dir', metavar = 'DIRECTORY', default = None,
                        help = 'Directory for output storage')

    try:
        c = ConfigGenerator(parser.parse_args())
        c._run()
    except h.ConfigError, e:
        print e
        sys.exit(-1)
