import argparse
from pathlib import Path

from straw.static import Default
from straw.straw import run

"""
The main executable script
When called parses the command line arguments and acts accordingly
"""

parser = argparse.ArgumentParser(description="Lossless multi-channel audio codec")
parser.add_argument("-i", "--input", dest="input_files", metavar="INPUT_FILE", type=str, nargs="+",
                    help="Input files", required=True)
parser.add_argument("-o", "--output", dest="output_file", metavar="OUTPUT_FILE", type=str,
                    help="Output file")
parser.add_argument("-d", "--decode", dest="decode", action="store_true",
                    help="Decode")

parser.add_argument("--figures", dest="figures", action="store_true",
                    help="Generate figures - temporary option for runs with non-consistent behavior")
parser.add_argument("--no-dynamic-blocks", dest="dynamic_blocksize", action="store_false",
                    help="Use dynamic blocksize, by default delimited by short-term energy")
parser.add_argument("--figures-show", dest="fig_show", action="store_true", help="Show figures")
parser.add_argument("--figures-dir", dest="fig_dir", metavar="FIG_DIR", type=str,
                    default="outputs", help="Override figure directory (default='outputs')")

parser.add_argument("--min-frame-size", dest="min_frame_size", metavar="MIN_FRAME_SIZE", type=int,
                    default=Default.min_frame_size, help="Override minimal frame size")
parser.add_argument("--max-frame-size", dest="max_frame_size", metavar="MAX_FRAME_SIZE", type=int,
                    default=Default.max_frame_size, help="Override maximal frame size")
parser.add_argument("--framing-threshold", dest="framing_treshold", metavar="THRESHOLD", type=int,
                    default=Default.framing_treshold, help="Override framing treshold")
parser.add_argument("--framing-resolution", dest="framing_resolution", metavar="RESOLUTION", type=int,
                    default=Default.framing_resolution, help="Override framing resolution")
parser.add_argument("--rice-responsiveness", dest="rice_responsiveness", metavar="RESPONSIVENESS", type=int,
                    default=Default.rice_responsiveness, help="Override Rice codding responsiveness")

parser.add_argument("--no-parallel", dest="parallel", action="store_false",
                    help="Disable parallelization")
parser.add_argument("--silent", dest="silent", action="store_true",
                    help="Silence the coder completely")
parser.add_argument("--verbose", dest="verbose", action="store_true",
                    help="Verbose output")

args = parser.parse_args()

if args.min_frame_size > args.max_frame_size:
    raise ValueError("Minimal frame size can't be larger than maximal frame size")

# Fix args
if args.output_file:
    args.output_file = Path(args.output_file)
else:
    pth = Path(args.input_files[0])
    if args.decode:
        args.output_file = (pth.parent / pth.stem).with_suffix(".wav")
    else:
        args.output_file = (pth.parent / pth.stem).with_suffix(".straw")

if args.figures:
    from figures import plot_all

    plot_all(args)
else:
    run(args)
