#!/usr/bin/env python3

import sys
import getopt
from datetime import datetime
import json
import logging

import ccbrowse
from ccbrowse.fetch import Calipso


def usage():
    sys.stderr.write('''Usage: {program_name} [OPTION]... TYPE STARTDATE STOPDATE
       {program_name} --help

Try `{program_name} --help\' for more information.
'''.format(program_name=program_name))


def print_help():
    sys.stdout.write('''Usage: {program_name} [OPTION]... TYPE STARTDATE STOPDATE
       {program_name} --help

Fetch product files in a specified time interval.

Positional arguments:
  TYPE            product type
  STARTDATE       start date specified as "YEAR-MONTH-DAY HOUR:MINUTE"
  STOPDATE        stop date specified as "YEAR-MONTH-DAY HOUR:MINUTE"

Optional arguments:
  -c FILE          configuration file (default: config.json)
  -O DIR           output files to a specified directory
  --continue ID    continue fetching order with specified tracking ID
  --help           print this help information

Supported product types:
  calipso

Report bugs to <ccplot-general@lists.sourceforge.net>
'''.format(program_name=program_name))


if __name__ == "__main__":
    program_name = sys.argv[0]
    logging.basicConfig(format=program_name+': %(message)s', level=logging.INFO)

    try:
        opts, args = getopt.getopt(sys.argv[1:], 'c:O:', ['help', 'continue='])
    except getopt.GetoptError as e:
        logging.error(e)
        usage()
        sys.exit(1)

    type = None
    filename = 'config.json'
    tracking_id = None
    outdir = ''

    for opt,value in opts:
        if opt == '--help':
            print_help()
            sys.exit(0)
        elif opt == '-c':
            filename = value
        elif opt == '-O':
            outdir = value
        elif opt == '--continue':
            tracking_id = value

    if len(args) < 1:
        usage()
        sys.exit(1)

    type = args[0]

    if not tracking_id:
        if len(args) != 3 and tracking_id is None:
            usage()
            sys.exit(1)

        try:
            startdate = datetime.strptime(args[1], '%Y-%m-%d %H:%M')
            stopdate = datetime.strptime(args[2], '%Y-%m-%d %H:%M')
        except ValueError as e:
            logging.error(e)
            sys.exit(1)
    else:
        startdate = None
        stopdate = None

    config = ccbrowse.config.default_config

    try:
        with open(filename) as fp:
            config.update(json.load(fp))
    except IOError as e:
        logging.error('%s: %s' % (e.filename, e.strerror))
        sys.exit(1)

    if type == 'calipso':
        try: provider = config['providers']['echo']
        except KeyError:
            logging.error('ECHO provider not defined in the configuration file')
            sys.exit(1)
        calipso = Calipso(provider, path=outdir)
        try: calipso.order(startdate, stopdate, tracking_id=tracking_id)
        except KeyboardInterrupt:
            print()
        #finally: calipso.cleanup()
    else:
        logging.error('Unrecognized type "%s"' % type)
        sys.exit(1)
