#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
#  Copyright (C) 2016-2017 Xavier Corredor Llano, SMBYC
#  Email: xcorredorl at ideam.gov.co
#
#  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 3 of the License, or
#  (at your option) any later version.
#
import os
import argparse
from datetime import datetime
from multiprocessing import cpu_count

from stack_composed import stack_composed, epilog


def script():
    """
    Run as a script with arguments
    """

    # Create parser arguments
    parser = argparse.ArgumentParser(
        prog='stack-composed',
        description='Compute and generate the composed of a raster images stack',
        epilog=epilog,
        formatter_class=argparse.RawTextHelpFormatter)

    def valid_date(s):
        try:
            return datetime.strptime(s, "%Y-%m-%d").date()
        except ValueError:
            msg = "not a valid date: '{0}'".format(s)
            raise argparse.ArgumentTypeError(msg)

    parser.add_argument('-stat', type=str, help='Statistic for compute the composed', required=True)
    parser.add_argument('-bands', type=str, help='band or bands to process, e.g. 1,2,3', required=True)
    parser.add_argument('-p', type=int, default=cpu_count() - 1,
                        help='number of process', required=False)
    parser.add_argument('-chunks', type=int, default=1000,
                        help='chunks size for parallel process', required=False)
    parser.add_argument('-start', type=valid_date, dest='start_date',
                        help='Initial date for filter data, format YYYY-MM-DD', required=False)
    parser.add_argument('-end', type=valid_date, dest='end_date',
                        help='End date for filter data, format YYYY-MM-DD', required=False)
    parser.add_argument('-o', type=str, dest='output', help='output directory and/or filename for save results',
                        default=os.getcwd())
    parser.add_argument('-ot', type=str, dest='output_type', help='output data type for results', required=False,
                        choices=('byte', 'uint16', 'uint32', 'int16', 'int32', 'float32', 'float64'))
    parser.add_argument('inputs', type=str, help='directories or images files to process', nargs='*')

    args = parser.parse_args()

    stack_composed.run(args.stat, args.bands, args.inputs, args.output, args.output_type, args.p, args.chunks,
                       args.start_date, args.end_date)

if __name__ == '__main__':
    script()
