# -*- coding: utf-8 -*-
#
# Copyright (c) 2016 Barcelona Supercomputing Center
# @license: https://www.gnu.org/licenses/gpl-3.0.html
# @author: see AUTHORS file

import os
import ConfigParser
from optparse import OptionParser
import mapgenerator

LISTOPTS = {
            'title'         :"string(default=None)",
            'maxtitle'      :"string(default=None)",
            'indir'         :"string(default=None)",
            'outdir'        :"string(default=None)",
            'bounds'        :"float_list(default=None)",
            'boundaries'    :"float_list(default=None)",
            'under'         :"string(default=None)",
            'over'          :"string(default=None)",
            'colors'        :"string_list(default=None)",
            'total'         :"integer(default=None)",
            'interval'      :"integer(default=None)",
            'freq'          :"integer(default=None)",
            'lon'           :"float_list(default=None)",
            'lat'           :"float_list(default=None)",
            'srcfile'       :"string_list(default=None)",
            'var'           :"string_list(default=None)",
            'gap'           :"string_list(default=None)",
            'wind'          :"string(default=None)",
            'windopts'      :"string_list(default=None)",
            'drawopts'      :"string_list(default=None)",
            'limits'        :"int_list(default=None)",
            'shapes'        :"string_list(default=None)",
            'resolution'    :"string(default=None)",
            'area_thresh'   :"integer(default=None)",
            'aspect'        :"boolean(default=None)",
            'max'           :"int_list(default=None)",
			'anim'          :"boolean(default=None)",
			'transf'        :"boolean(default=None)",
			'nointerp'      :"boolean(default=None)",
			'scatter'       :"string(default=None)",
			'dpi'           :"integer(default=None)",
			'xsize'         :"float(default=None)",
			'ysize'         :"float(default=None)",
            'lower'         :"float(default=None)",
            'contours'      :"string(default=None)",
            'img_template'  :"string(default=None)",
            'joint_template':"string(default=None)",
            'contours_color':"string(default=None)",
            'contours_label':"boolean(default=None)",
            'nocontourf'    :"boolean(default=None)",
            'nomap'         :"boolean(default=None)",
            'start'         :"integer(default=None)",
            'contours_interval'    :"integer(default=None)",
            'colorbar'      :"boolean(default=None)",
            'hidden_tsteps' :"int_list(default=None)",
            'varconds'      :"string(default=None)",
            'overwrite'     :"boolean(default=None)",
            'background'    :"boolean(default=None)",
            'logo'          :"string_list(default=None)",
            'noruntime'     :"boolean(default=None)",
            'kml'           :"boolean(default=None)",
            'kmz'           :"boolean(default=None)",
           }


def parseOpts():
    """ """

    usage_msg = """usage: %prog [options] [sectionname]
-c, -- config
    configuration file to be read
"""

    def list_callback(option, opt_str, value, parser):
        setattr(parser.values, option.dest, value.split(','))
        print "**************", value, type(value)
        print '\toption:', repr(option)
        print '\topt_str:', opt_str
        print '\tvalue:', value
        print '\tparser:', parser
        return

    parser = OptionParser(usage=usage_msg, version=mapgenerator.__version__)
    parser.add_option("-a", "--anim",
                      action="store",
                      dest="anim",
                      default="",
                      help="Toggle Animation")
    parser.add_option("-A", "--area-threshold",
                      action="store",
                      dest="area_thresh",
                      default="",
                      help="Area threshold in surface drawing (including lakes)")
    parser.add_option("-b", "--bounds",
                      action="store",
                      dest="bounds",
                      default="",
                      help="map bounds")
    parser.add_option("-B", "--boundaries",
                      action="store",
                      dest="boundaries",
                      default="",
                      help="map boundaries")
    parser.add_option("-c", "--config",
                      action="store", # optional because action defaults to "store"
                      dest="configfile",
                      default="",
                      help="config file to read",)
    parser.add_option("-C", "--colors",
                      action="store",
                      dest="colors",
                      default="",
                      help="color map colors")
    parser.add_option("-d", "--draw",
                      action="store",
                      dest="drawopts",
                      default="",
                      help="Additional drawing options (coastlines, states, etc.)")
    parser.add_option("-D", "--dpi",
                      action="store",
                      dest="dpi",
                      default="",
                      help="Output image dpi")
    parser.add_option("", "--img_template",
                      action="store",
                      dest="img_template",
                      default="",
                      help="Image template")
    parser.add_option("", "--joint_template",
                      action="store",
                      dest="joint_template",
                      default="",
                      help="Joint template")
    parser.add_option("", "--nomap",
                      action="store",
                      dest="nomap",
                      default="",
                      help="No Map")
    parser.add_option("-e", "--transf",
                      action="store",
                      dest="transf",
                      default="",
                      help="Transform coordinates")
    parser.add_option("-f", "--freq",
                      action="store",
                      dest="freq",
                      default="",
                      help="frequency of time instants")
    parser.add_option("-g", "--gap",
                      action="store",
                      dest="gap",
                      default="",
                      help="gap between time steps in different sources, specified as the first hour for each source")
    parser.add_option("-i", "--indir",
                      action="store",
                      dest="indir",
                      default="",
                      help="directory where is stored the input file(s)")
    parser.add_option("-I", "--interval",
                      action="store",
                      dest="interval",
                      default="",
                      help="interval of time instants")
    parser.add_option("-k", "--scatter",
                      action="store",
                      dest="scatter",
                      default="",
                      help="data file for additional scatter plot")
    parser.add_option("-K", "--contours",
                      action="store",
                      dest="contours",
                      default="",
                      help="additional contour data")
    parser.add_option("-l", "--lon",
                      action="store",
                      dest="lon",
                      default="",
                      help="longitude")
    parser.add_option("-L", "--lat",
                      action="store",
                      dest="lat",
                      default="",
                      help="latitude")
    parser.add_option("-m", "--maxtitle",
                      action="store",
                      dest="maxtitle",
                      default="",
                      help="title of the max figure")
    parser.add_option("-M", "--max",
                      action="store",
                      dest="max",
                      default="",
                      help="max")
    parser.add_option("-n", "--contours_interval",
                      action="store",
                      dest="contours_interval",
                      default="",
                      help="interval between contours")
    parser.add_option("", "--nointerp",
                      action="store",
                      dest="nointerp",
                      default="",
                      help="Use pcolor instead of contourf")
    parser.add_option("", "--contours_color",
                      action="store",
                      dest="contours_color",
                      default="",
                      help="contours color")
    parser.add_option("", "--varconds",
                      action="store",
                      dest="varconds",
                      default="",
                      help="varconds")
    parser.add_option("", "--contours_label",
                      action="store",
                      dest="contours_label",
                      default="",
                      help="contours label")
    parser.add_option("", "--hidden_tsteps",
                      action="store",
                      dest="hidden_tsteps",
                      default="",
                      help="hidden tsteps")
    parser.add_option("", "--nocontourf",
                      action="store",
                      dest="nocontourf",
                      default="",
                      help="no contourf")
    parser.add_option("-N", "--start-at",
                      action="store",
                      dest="start",
                      default="",
                      help="starting time")
    parser.add_option("-o", "--outdir",
                      action="store",
                      dest="outdir",
                      default="",
                      help="directory where is to be stored the output file(s)")
    parser.add_option("-O", "--over",
                      action="store",
                      dest="over",
                      default="",
                      help="color of over scale values")
    parser.add_option("-p", "--colorbar",
                      action="store",
                      dest="colorbar",
                      default="",
                      help="Draw the colorbar?")
    parser.add_option("-r", "--resolution",
                      action="store",
                      dest="resolution",
                      default="",
                      help="resolution")
    parser.add_option("-R", "--preserve-aspect",
                      action="store",
                      dest="aspect",
                      default="True",
                      help="preserve map aspect ratio when drawing")
    parser.add_option("-s", "--srcfile",
                      type="string",
                      action="callback",
                      dest="srcfile",
                      callback=list_callback,
                      help="main source file")
    parser.add_option("-S", "--shapefiles",
                      action="store",
                      dest="shapes",
                      default="",
                      help="additional shape files")
    parser.add_option("-t", "--title",
                      action="store",
                      dest="title",
                      default="",
                      help="title of the figure")
    parser.add_option("-T", "--total",
                      action="store",
                      dest="total",
                      default="",
                      help="total time instants")
    parser.add_option("-u", "--under",
                      action="store",
                      dest="under",
                      default="",
                      help="color of under scale values")
    parser.add_option("-v", "--var",
                      action="store",
                      dest="srcvar",
                      default="",
                      help="main variable")
    parser.add_option("-w", "--wind",
                      action="store",
                      dest="wind",
                      default="",
                      help="wind src file")
    parser.add_option("-W", "--windopts",
                      action="store",
                      dest="windopts",
                      default="",
                      help="wind options")
    parser.add_option("-x", "--limits",
                      action="store",
                      dest="limits",
                      default="",
                      help="limits")
    parser.add_option("-X", "--xsize",
                      action="store",
                      dest="xsize",
                      default="",
                      help="Proportion of X dimension (between 0 and 1)")
    parser.add_option("-Y", "--ysize",
                      action="store",
                      dest="ysize",
                      default="",
                      help="Proportion of Y dimension (between 0 and 1)")
    parser.add_option("", "--kml",
                      action="store",
                      dest="kml",
                      default="",
                      help="Generate KML")
    parser.add_option("", "--kmz",
                      action="store",
                      dest="kmz",
                      default="",
                      help="Generate KMZ")
    parser.add_option("", "--overwrite",
                      action="store",
                      dest="overwrite",
                      default="True",
                      help="Overwrite")
    parser.add_option("", "--background",
                      action="store",
                      dest="background",
                      default="",
                      help="Background")
    parser.add_option("", "--logo",
                      action="store",
                      dest="logo",
                      default="",
                      help="Logo")
    parser.add_option("", "--noruntime",
                      action="store",
                      dest="noruntime",
                      default="",
                      help="No runtime")
    return parser


def readConf(section=None, fpath=None):
    """ Read configuration """

    config = ConfigParser.RawConfigParser()
    config.read(fpath)
    if section == None:
        return config.sections()

    res = {}
    for k, v in config.items(section):
        try:
            res[k] = eval(v)
        except:
            res[k] = v
    return res


def writeConf(section, fpath, opts):
    """ Write configurations on file. """

    config = ConfigParser.RawConfigParser()

    # check if file exists
    if os.path.exists(fpath):
        config.read(fpath)

    # check if section exists
    if not config.has_section(section):
        config.add_section(section)

    # update configuration
    for item in opts:
        val = opts[item]
        config.set(section, item, val)

    # write configuration
    with open(fpath, 'wb') as configfile:
        config.write(configfile)

