#!python
import os
import argparse
import audio_degrader
import logging
from audio_degrader import ParametersParser
from audio_degrader import DegradationUsageDocGenerator
from audio_degrader import DegradedAudioFile
from audio_degrader import ALL_DEGRADATIONS


DEFAULT_TMP_DIR = "./audio_degrader_tmp"

def main(in_wav, tmp_dir, degradations_args, out_wav):
    """ Apply sequence of degradations to in_wav and stores result in out_wav

    Args:
        in_wav (string): Path of input wav file (any format)
        tmp_dir (string): Path of directory for temporary files
        degradations_args (list of strings): List of degradations to be applied
        out_wav (string): Path of output wav file (always stereo)
    """
    logging.info("Creating DegradedAudioFile object")
    degraded_audio_file = DegradedAudioFile(in_wav, tmp_dir)
    logging.info("Parsing degradations list: {0}".format(degradations_args))
    degradations = ParametersParser.parse_degradations_args(degradations_args)
    for degradation in degradations:
        logging.info("Applying {0}".format(degradation.name))
        try:
            logging.info("    with parameters {0}".format(
                degradation.parameters_values))
        except:
            logging.info("    without parameters")
        degraded_audio_file.apply_degradation(degradation)
    logging.info("Exporting to wav")
    degraded_audio_file.to_wav(out_wav)
    logging.info("Deleting temporary mirror file")
    degraded_audio_file.delete_tmp_mirror_file()

if __name__ == "__main__":
    main_description = "Process audio with a sequence of degradations:\n"
    main_description += '\n'.join(sorted(
        [DegradationUsageDocGenerator.get_degradation_help(d) for d in
         ALL_DEGRADATIONS.values()]))
    parser = argparse.ArgumentParser(
        description=main_description,
        formatter_class=argparse.RawTextHelpFormatter,
        epilog=("For examples of degradations see " +
                "https://github.com/EliosMolina/audio_degrader"))

    parser.add_argument('-i', '--input',
                        type=str,
                        help='Input audio wav')
    parser.add_argument('-t', '--tmpdir',
                        type=str,
                        help=('Temporal directory. ' +
                              'Default: {0}'.format(DEFAULT_TMP_DIR)),
                        default=DEFAULT_TMP_DIR)
    parser.add_argument('-d', '--degradations', metavar='degradation,params',
                        type=str,
                        nargs='*',
                        help='List of sequential degradations')
    parser.add_argument('-o', '--output',
                        type=str,
                        help='Output audio wav')
    parser.add_argument('-l', '--list-resources', action='store_true',
                        dest='list_resources',
                        help='List all available resources')
    parser.add_argument('-v', '--verbosity_level', dest='verbosity_level',
                        type=str,
                        help=('Options: ERROR, WARNING, INFO, DEBUG. ' +
                              'Default: WARNING'),
                        default='WARNING')
    args = vars(parser.parse_args())
    logging_levels = {'ERROR': logging.ERROR,
                      'WARNING': logging.WARNING,
                      'INFO': logging.INFO,
                      'DEBUG': logging.DEBUG}
    logging.basicConfig(level=logging_levels[args['verbosity_level']])


    if (not args['input'] or
        not args['output'] or
            not args['degradations']) and not args['list_resources']:
        parser.print_help()
        exit(1)
    if args['list_resources']:
        resources_dir = os.path.join(audio_degrader.__path__[0],
                                     'resources')
        print "Available resources"
        print "Directory: {0}".format(resources_dir)
        for root, dirs, fnames in os.walk(resources_dir):
            rel_dir = os.path.relpath(root, resources_dir)
            for fname in fnames:
                if os.path.splitext(fname)[1] == '.wav':
                    print "  " + os.path.join(rel_dir, fname)
        exit(0)

    main(args['input'],
         args['tmpdir'],
         args['degradations'],
         args['output'])
