#!/usr/bin/env python

############################################################################
#
# MODULE:       d.rast.leg
# AUTHOR(S):
#               Jianping Xu and Scott Madry, Rutgers University. October 19, 1993
#               Markus Neteler 8/2002: added simple d.legend logic
#               Markus Neteler 10/2003: added g.parser
#               Michael Barton 12/2004: remove reference to (null)
#               Glynn Clements 10/2008: converted to Python
#
# PURPOSE:      Displays a raster map and its legend on a graphics window.
#
# Description:  d.rast.leg clears the entire screen, divides it into a main
#               (left) and a minor (right) frames, and then display a raster
#               map in the main frame and the map legend in the minor frame.
#               The user can run the program interactively or
#               non-interactively.
#
# See also:     d.rast, d.legend.
#
# COPYRIGHT:	(C) 1993-2014 by the GRASS Development Team
#
#               This program is free software under the GNU General Public
#               License (>=v2). Read the file COPYING that comes with GRASS
#               for details.
#
#############################################################################

#%module
#% description: Displays a raster map and its legend on a graphics window
#% keyword: display
#% keyword: cartography
#% keyword: legend
#%end
#%flag
#%  key: f
#%  description: Flip legend
#%end
#%flag
#%  key: n
#%  description: Omit entries with missing label
#%end
#%option G_OPT_R_MAP
#% description: Name of raster map to display
#%end
#%flag
#%  key: s
#%  description: Draw smooth gradient
#%end
#%option
#% key: lines
#% type: integer
#% description: Number of lines to appear in the legend
#% required: no
#%end
#%option G_OPT_R_INPUT
#% key: raster
#% description: Name of input raster map to generate legend from
#% required: no
#%end

import sys
import os
import grass.script as grass

def make_frame(f, b, t, l, r):
    (fl, fr, ft, fb) = f

    t /= 100.0
    b /= 100.0
    l /= 100.0
    r /= 100.0

    rt = fb + t * (ft - fb)
    rb = fb + b * (ft - fb)
    rl = fl + l * (fr - fl)
    rr = fl + r * (fr - fl)
    s = '%f,%f,%f,%f' % (rt, rb, rl, rr)
    os.environ['GRASS_RENDER_FRAME'] = s


def main():
    map = options['map']
    nlines = options['lines']
    rast = options['raster']
    omit = flags['n']
    flip = flags['f']
    smooth = flags['s']

    # for -n flag of d.legend
    if not grass.find_file(map)['file']:
        grass.fatal(_("Raster map <%s> not found") % map)

    # for rast=
    if rast and not grass.find_file(rast)['file']:
        grass.fatal(_("Raster map <%s> not found") % rast)

    s = grass.read_command('d.info', flags='f')
    if not s:
        sys.exit(1)

    # fixes trunk r64459
    s = s.split(':')[1]
    f = tuple([float(x) for x in s.split()])

    grass.run_command('d.erase')
    os.environ['GRASS_RENDER_FILE_READ'] = 'TRUE'

    # draw title

    # set vertical divide at 65 instead of 80 if real labels in cats/ file??
    make_frame(f, 90, 100, 70, 100)
    # use map name without mapset suffix
    mapname = map.split('@')[0]
    grass.run_command('d.text', color='black', size=5, at='5,97', align='cl',
                      text=mapname)

    # draw legend

    # set legend vertical position and size based on number of categories
    cats = grass.read_command('r.describe', map=map, flags='1n')
    ncats = len(cats.strip().split('\n'))

    # Only need to adjust legend size if number of categories is between 1 and 10
    if ncats < 2: ncats = 2
    if ncats > 10: ncats = 10

    VSpacing = (100 - (ncats * 10) + 10)

    if not nlines:
        nlines = None

    if rast:
        lmap = rast
    else:
        lmap = map

    kv = grass.raster_info(map=lmap)
    if kv['datatype'] is 'CELL':
        leg_at = None
    else:
        leg_at = '%f,95,5,10' % VSpacing

# checking for histogram causes more problems than it solves
#    histfiledir = grass.find_file(lmap, 'cell_misc')['file']
#    has_hist = os.path.isfile(os.path.join(histfiledir, 'histogram'))

    lflags = ''
    if flip:
        lflags += 'f'
    if omit:
        lflags += 'n'
    if smooth:
        lflags += 's'

#    if has_hist or omit:
#        lflags += 'n'

    make_frame(f, 0, 90, 70, 100)
    grass.run_command('d.legend', flags=lflags, raster=lmap, lines=nlines,
                      at=leg_at)

    # draw map
    make_frame(f, 0, 100, 0, 70)
    grass.run_command('d.rast', map=map)


if __name__ == "__main__":
    options, flags = grass.parser()
    main()
