#!/usr/bin/env python
##
#
# Vaisala software source code file
#
# Copyright (c) Vaisala Oyj 2015. All rights reserved.
#
##
"""
Tool for setting up Vaisala Radar Software Distribution's basemap layers and
styles.
"""
import argparse
import json
import logging
import subprocess
import sys


logger = logging.getLogger('rsw-basemap-layer-setup')


def run_mapnik_to_geoserver(geoserver_admin_password, database, database_password,
                            max_zoom=None, skip_terrain=False):
    command = ["python",
               "/usr/vaisala/radarsw/gis/bin/mapnik_to_geoserver.py",
               "--file", "/usr/vaisala/radarsw/gis/share/configuration/mapnik.xml",
               "--rest", "http://localhost:34180/geoserver/rest/",
               "--gwc-rest", "http://localhost:34180/geoserver/gwc/rest/",
               "--rest-user", "admin",
               "--rest-password", geoserver_admin_password,
               "--db", database,
               "--password", database_password,
               "--schema", "osm_data",
               "--image-path", "/srv/vaisala/radarsw/geoserver/data/images/",
       ]

    if max_zoom is not None:
        command += ['--max-zoom', str(max_zoom)]

    if skip_terrain is False:
        command += ["--terrain-path", "coverages/terrain"]

    logger.info(u"Starting layer setup...")
    subprocess.check_call(command)
    logger.info("Layer setup done.")


def main(args):
    def setup_logging(debug_enabled):
        root = logging.getLogger()
        if debug_enabled:
            root.setLevel(logging.DEBUG)
        else:
            root.setLevel(logging.INFO)
        ch = logging.StreamHandler(sys.stdout)
        ch.setLevel(logging.DEBUG)
        formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
        ch.setFormatter(formatter)
        root.addHandler(ch)
    setup_logging(args.debug)

    gis_settings = json.loads(subprocess.check_output(['rsw-gis-db-tool', 'show']))
    logger.debug(u"GIS settings {} loaded.".format(', '.join(gis_settings.keys())))
    geoserver_settings = json.loads(subprocess.check_output(['rsw-geoserver-password-tool', 'show']))
    logger.debug(u"GeoServer settings {} loaded.".format(', '.join(geoserver_settings.keys())))

    run_mapnik_to_geoserver(geoserver_settings['admin_password'],
                            gis_settings['database'], gis_settings['password'],
                            max_zoom=args.max_zoom, skip_terrain=args.skip_terrain)


if __name__ == "__main__":
    parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
    parser.add_argument("--max-zoom", dest="max_zoom", type=int,
                        help=argparse.SUPPRESS)
    parser.add_argument("--skip-terrain", dest="skip_terrain", action="store_true",
                        help="Skip terrain layer setup.", default=False)
    parser.add_argument("-d", "--debug", dest="debug", action="store_true", help="Enable debug logging.")
    args = parser.parse_args()
    main(args)
