from spillway.compat import mapnik

# ColorBrewer http://colorbrewer2.org/
colors = {'YlGnBu': ('#ffffd9', '#edf8b1', '#c7e9b4', '#7fcdbb', '#41b6c4',
                     '#1d91c0', '#225ea8', '#253494', '#081d58'),
          'YlGn': ('#ffffe5', '#f7fcb9', '#d9f0a3', '#addd8e', '#78c679',
                   '#41ab5d', '#238443', '#006837', '#004529'),
          'YlGnBu': ('#ffffd9', '#edf8b1', '#c7e9b4', '#7fcdbb', '#41b6c4',
                     '#1d91c0', '#225ea8', '#253494', '#081d58'),
          'GnBu': ('#f7fcf0', '#e0f3db', '#ccebc5', '#a8ddb5', '#7bccc4',
                   '#4eb3d3', '#2b8cbe', '#0868ac', '#084081'),
          'BuGn': ('#f7fcfd', '#e5f5f9', '#ccece6', '#99d8c9', '#66c2a4',
                   '#41ae76', '#238b45', '#006d2c', '#00441b'),
          'PuBuGn': ('#fff7fb', '#ece2f0', '#d0d1e6', '#a6bddb', '#67a9cf',
                     '#3690c0', '#02818a', '#016c59', '#014636'),
          'PuBu': ('#fff7fb', '#ece7f2', '#d0d1e6', '#a6bddb', '#74a9cf',
                   '#3690c0', '#0570b0', '#045a8d', '#023858'),
          'BuPu': ('#f7fcfd', '#e0ecf4', '#bfd3e6', '#9ebcda', '#8c96c6',
                   '#8c6bb1', '#88419d', '#810f7c', '#4d004b'),
          'RdPu': ('#fff7f3', '#fde0dd', '#fcc5c0', '#fa9fb5', '#f768a1',
                   '#dd3497', '#ae017e', '#7a0177', '#49006a'),
          'PuRd': ('#f7f4f9', '#e7e1ef', '#d4b9da', '#c994c7', '#df65b0',
                   '#e7298a', '#ce1256', '#980043', '#67001f'),
          'OrRd': ('#fff7ec', '#fee8c8', '#fdd49e', '#fdbb84', '#fc8d59',
                   '#ef6548', '#d7301f', '#b30000', '#7f0000'),
          'YlOrRd': ('#ffffcc', '#ffeda0', '#fed976', '#feb24c', '#fd8d3c',
                     '#fc4e2a', '#e31a1c', '#bd0026', '#800026'),
          'YlOrBr': ('#ffffe5', '#fff7bc', '#fee391', '#fec44f', '#fe9929',
                     '#ec7014', '#cc4c02', '#993404', '#662506'),
          'Purples': ('#fcfbfd', '#efedf5', '#dadaeb', '#bcbddc', '#9e9ac8',
                      '#807dba', '#6a51a3', '#54278f', '#3f007d'),
          'Blues': ('#f7fbff', '#deebf7', '#c6dbef', '#9ecae1', '#6baed6',
                    '#4292c6', '#2171b5', '#08519c', '#08306b'),
          'Greens': ('#f7fcf5', '#e5f5e0', '#c7e9c0', '#a1d99b', '#74c476',
                     '#41ab5d', '#238b45', '#006d2c', '#00441b'),
          'Oranges': ('#fff5eb', '#fee6ce', '#fdd0a2', '#fdae6b', '#fd8d3c',
                      '#f16913', '#d94801', '#a63603', '#7f2704'),
          'Reds': ('#fff5f0', '#fee0d2', '#fcbba1', '#fc9272', '#fb6a4a',
                   '#ef3b2c', '#cb181d', '#a50f15', '#67000d'),
          'Greys': ('#ffffff', '#f0f0f0', '#d9d9d9', '#bdbdbd', '#969696',
                    '#737373', '#525252', '#252525', '#000000'),
          'PuOr': ('#7f3b08', '#b35806', '#e08214', '#fdb863', '#fee0b6',
                   '#f7f7f7', '#d8daeb', '#b2abd2', '#8073ac', '#542788',
                   '#2d004b'),
          'BrBG': ('#543005', '#8c510a', '#bf812d', '#dfc27d', '#f6e8c3',
                   '#f5f5f5', '#c7eae5', '#80cdc1', '#35978f', '#01665e',
                   '#003c30'),
          'PRGn': ('#40004b', '#762a83', '#9970ab', '#c2a5cf', '#e7d4e8',
                   '#f7f7f7', '#d9f0d3', '#a6dba0', '#5aae61', '#1b7837',
                   '#00441b'),
          'PiYG': ('#8e0152', '#c51b7d', '#de77ae', '#f1b6da', '#fde0ef',
                   '#f7f7f7', '#e6f5d0', '#b8e186', '#7fbc41', '#4d9221',
                   '#276419'),
          'RdBu': ('#67001f', '#b2182b', '#d6604d', '#f4a582', '#fddbc7',
                   '#f7f7f7', '#d1e5f0', '#92c5de', '#4393c3', '#2166ac',
                   '#053061'),
          'RdGy': ('#67001f', '#b2182b', '#d6604d', '#f4a582', '#fddbc7',
                   '#ffffff', '#e0e0e0', '#bababa', '#878787', '#4d4d4d',
                   '#1a1a1a'),
          'RdYlBu': ('#a50026', '#d73027', '#f46d43', '#fdae61', '#fee090',
                     '#ffffbf', '#e0f3f8', '#abd9e9', '#74add1', '#4575b4',
                     '#313695'),
          'Spectral': ('#9e0142', '#d53e4f', '#f46d43', '#fdae61', '#fee08b',
                       '#ffffbf', '#e6f598', '#abdda4', '#66c2a5', '#3288bd',
                       '#5e4fa2'),
          'RdYlGn': ('#a50026', '#d73027', '#f46d43', '#fdae61', '#fee08b',
                     '#ffffbf', '#d9ef8b', '#a6d96a', '#66bd63', '#1a9850',
                     '#006837'),
          'Accent': ('#7fc97f', '#beaed4', '#fdc086', '#ffff99', '#386cb0',
                     '#f0027f', '#bf5b17', '#666666'),
          'Dark2': ('#1b9e77', '#d95f02', '#7570b3', '#e7298a', '#66a61e', '#e6ab02',
                    '#a6761d', '#666666'),
          'Paired': ('#a6cee3', '#1f78b4', '#b2df8a', '#33a02c', '#fb9a99', '#e31a1c',
                     '#fdbf6f', '#ff7f00', '#cab2d6', '#6a3d9a', '#ffff99', '#b15928'),
          'Pastel1': ('#fbb4ae', '#b3cde3', '#ccebc5', '#decbe4', '#fed9a6', '#ffffcc',
                      '#e5d8bd', '#fddaec', '#f2f2f2'),
          'Pastel2': ('#b3e2cd', '#fdcdac', '#cbd5e8', '#f4cae4', '#e6f5c9', '#fff2ae',
                      '#f1e2cc', '#cccccc'),
          'Set1': ('#e41a1c', '#377eb8', '#4daf4a', '#984ea3', '#ff7f00', '#ffff33',
                   '#a65628', '#f781bf', '#999999'),
          'Set2': ('#66c2a5', '#fc8d62', '#8da0cb', '#e78ac3', '#a6d854', '#ffd92f',
                   '#e5c494', '#b3b3b3'),
          'Set3': ('#8dd3c7', '#ffffb3', '#bebada', '#fb8072', '#80b1d3', '#fdb462',
                   '#b3de69', '#fccde5', '#d9d9d9', '#bc80bd', '#ccebc5', '#ffed6f'),
          # Generic Mapping Tools (GMT) http://gmt.soest.hawaii.edu/
          # FIXME: Start using css for these lengthy gradients, call static template tag
          # to get css file path.
          'Haxby': ('#0a0079', '#280096', '#1405af', '#000ac8', '#0019d4', '#0028e0', '#1a66f0',
'#0d81f8', '#19afff', '#32beff', '#44caff', '#61e1f0', '#6aebe1', '#7cebc8',
'#8aecae', '#acf5a8', '#cdffa2', '#dff58d', '#f0ec79', '#f7d768', '#ffbd57',
'#ffa045', '#f4754b', '#ee504e', '#ff5a5a', '#ff7c7c', '#ff9e9e', '#f5b3ae',
'#ffc4c4', '#ffd7d7', '#ffebeb', '#fffefd')}
# Add reversed colors.
colors.update({'%s_r' % k: tuple(reversed(v)) for k, v in colors.items()})

def add_colorizer_stops(style, bins, mcolors):
    rule = style.rules[0]
    symbolizer = rule.symbols[0]
    for value, color in zip(bins, mcolors):
        symbolizer.colorizer.add_stop(value, mapnik.Color(color))
    return style

def make_raster_style():
    """Returns a default raster Style."""
    style = mapnik.Style()
    rule = mapnik.Rule()
    symbolizer = mapnik.RasterSymbolizer()
    symbolizer.colorizer = mapnik.RasterColorizer(
        mapnik.COLORIZER_LINEAR, mapnik.Color(0, 0, 0, 255))
    rule.symbols.append(symbolizer)
    style.rules.append(rule)
    return style

#class RasterLayer(mapnik.Layer):
    #def layer(self, band=1):
        #layer = mapnik.Layer(str(self), SpatialReference(self.srs).proj4)
        #layer.datasource = mapnik.Gdal(file=self.image.path, band=band)
        #return layer

def raster_to_layer(raster, band=1):
    layer = mapnik.Layer(str(raster), SpatialReference(raster.srs).proj4)
    layer.datasource = mapnik.Gdal(file=raster.image.path, band=band)
    return layer

#def add_layer()
def _to_layer(object, stylename, canvas):
    try:
        style = canvas.find_style(stylename)
    except KeyError:
        style = make_raster_style()
        canvas.append_style(stylename, style)
        add_colorizer_stops(style, (object.minval, object.maxval),
                            name=stylename)
    try:
        layer = object.layer()
    except AttributeError:
        pass
    else:
        #if hasattr(style,
        #if layer.datasource.type() == mapnik.DataType.Raster:
            #styles.add_colorizer_stops(
                #style, (object.minval, object.maxval), name=stylename)
        #else: Vector?
        layer.styles.append(stylename)
        # Must append layer to map *after* appending style to it.
        canvas.layers.append(layer)

#def adjust_breaks(colorizer, extrema):
#def rebin()
#def adjust_bins(colorizer, extrema, nbins=None, binwidth=None):
#def adjust_to_minmax(colorizer, extrema, equal_width=True):
    ## Generate equal interval bins from min/max pixel values.
    #if equal_width:
        ##breaks = np.linspace(*extrema + (len(colorizer.stops),))
        ## Update the stop values for the color ramp.
        #for stop, breakval in zip(colorizer.stops, breaks):
            #stop.value = breakval
    #else:
        #colorizer.stops[0] =
    #return colorizer

#def adjust_intervals(colorizer, extrema):
#def adjust_to_minmax(colorizer, extrema):
#def adjust_equint(colorizer, extrema):
def equalize_intervals(style, values):
    """Adjust RasterColorizer to equal intervals."""
    rule = style.rules[0]
    symbolizer = rule.symbols[0]
    stops = symbolizer.colorizer.stops
    # Generate equal interval bins from min/max pixel values.
    breaks = np.linspace(values[0], values[-1], len(stops))
    # Update the stop values for the color ramp.
    for stop, breakval in zip(stops, breaks):
        stop.value = breakval
        print stop, breakval
    #return colorizer
    return style
