#!/usr/bin/env python3

############################################################################
#
# MODULE:	v.db.univar (formerly called v.univar.sh)
# AUTHOR(S):	Michael Barton, Arizona State University
#               Converted to Python by Glynn Clements
#               Sync'ed to r.univar by Markus Metz
# PURPOSE:	Calculates univariate statistics from a GRASS vector map attribute column.
#               Based on r.univar.sh by Markus Neteler
# COPYRIGHT:	(C) 2005, 2007, 2008 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: Calculates univariate statistics on selected table column for a GRASS vector map.
# % keyword: vector
# % keyword: statistics
# % keyword: attribute table
# %end
# %option G_OPT_V_MAP
# % required: yes
# %end
# %option G_OPT_V_FIELD
# %end
# %option G_OPT_DB_COLUMN
# % description: Name of attribute column on which to calculate statistics (must be numeric)
# % required: yes
# %end
# %option G_OPT_DB_WHERE
# %end
# %option
# % key: percentile
# % type: double
# % description: Percentile to calculate (requires extended statistics flag)
# % required : no
# % answer: 90
# % options: 0-100
# % multiple: yes
# %end
# %flag
# % key: e
# % description: Extended statistics (quartiles and 90th percentile)
# %end
# %flag
# % key: g
# % description: Print stats in shell script style
# %end

import sys
import os
import grass.script as gscript
from grass.exceptions import CalledModuleError


def main():
    global tmp
    tmp = gscript.tempfile()

    vector = options["map"]
    layer = options["layer"]
    column = options["column"]
    where = options["where"]
    perc = options["percentile"]

    if not gscript.find_file(vector, element="vector")["file"]:
        gscript.fatal(_("Vector map <%s> not found") % vector)

    try:
        fi = gscript.vector_db(vector, stderr=nuldev)[int(layer)]
    except KeyError:
        gscript.fatal(_("No attribute table linked to layer <%s>") % layer)

    table = fi["table"]
    database = fi["database"]
    driver = fi["driver"]

    passflags = None
    if flags["e"]:
        passflags = "e"
    if flags["g"]:
        if not passflags:
            passflags = "g"
        else:
            passflags = passflags + "g"

    try:
        gscript.run_command(
            "db.univar",
            table=table,
            column=column,
            database=database,
            driver=driver,
            perc=perc,
            where=where,
            flags=passflags,
        )
    except CalledModuleError:
        sys.exit(1)


if __name__ == "__main__":
    options, flags = gscript.parser()
    nuldev = open(os.devnull, "w")
    main()
