# -*- coding: utf-8 -*-

"""
***************************************************************************
    store.py
    ---------------------
    Date                 : November 2012
    Copyright            : (C) 2012 by David Winslow
    Email                : dwins at opengeo dot com
***************************************************************************
*                                                                         *
*   This program is free software; you can redistribute it and/or modify  *
*   it under the terms of the GNU General Public License as published by  *
*   the Free Software Foundation; either version 2 of the License, or     *
*   (at your option) any later version.                                   *
*                                                                         *
***************************************************************************
"""

__author__ = 'David Winslow'
__date__ = 'November 2012'
__copyright__ = '(C) 2012, David Winslow'

# This will get replaced with a git SHA1 when you do a git archive

__revision__ = '$Format:%H$'

from processing.admintools.geoserver.workspace import Workspace
from processing.admintools.geoserver.resource import featuretype_from_index, \
    coverage_from_index
from processing.admintools.geoserver.support import ResourceInfo, \
    xml_property, key_value_pairs, write_bool, write_dict, write_string, url


def datastore_from_index(catalog, workspace, node):
    name = node.find('name')
    return DataStore(catalog, workspace, name.text)


def coveragestore_from_index(catalog, workspace, node):
    name = node.find('name')
    return CoverageStore(catalog, workspace, name.text)


class DataStore(ResourceInfo):

    resource_type = 'dataStore'
    save_method = 'PUT'

    def __init__(self, catalog, workspace, name):
        super(DataStore, self).__init__()

        assert isinstance(workspace, Workspace)
        assert isinstance(name, basestring)
        self.catalog = catalog
        self.workspace = workspace
        self.name = name

    @property
    def href(self):
        return url(self.catalog.service_url, ['workspaces',
                   self.workspace.name, 'datastores', self.name + '.xml'])

    enabled = xml_property('enabled', lambda x: x.text == 'true')
    name = xml_property('name')
    connection_parameters = xml_property('connectionParameters',
            key_value_pairs)

    writers = dict(enabled=write_bool('enabled'), name=write_string('name'),
                   connectionParameters=write_dict('connectionParameters'))

    def get_resources(self):
        res_url = url(self.catalog.service_url, ['workspaces',
                      self.workspace.name, 'datastores', self.name,
                      'featuretypes.xml'])
        xml = self.catalog.get_xml(res_url)

        def ft_from_node(node):
            return featuretype_from_index(self.catalog, self.workspace, self,
                    node)

        return [ft_from_node(node) for node in xml.findall('featureType')]


class UnsavedDataStore(DataStore):

    save_method = 'POST'

    def __init__(self, catalog, name, workspace):
        super(UnsavedDataStore, self).__init__(catalog, workspace, name)
        self.dirty.update(dict(name=name, enabled=True,
                          connectionParameters=dict()))

    @property
    def href(self):
        path = ['workspaces', self.workspace.name, 'datastores']
        query = dict(name=self.name)
        return url(self.catalog.service_url, path, query)


class CoverageStore(ResourceInfo):

    resource_type = 'coverageStore'
    save_method = 'PUT'

    def __init__(self, catalog, workspace, name):
        super(CoverageStore, self).__init__()

        assert isinstance(workspace, Workspace)
        assert isinstance(name, basestring)

        self.catalog = catalog
        self.workspace = workspace
        self.name = name

    @property
    def href(self):
        return url(self.catalog.service_url, ['workspaces',
                   self.workspace.name, 'coveragestores', self.name + '.xml'])

    enabled = xml_property('enabled', lambda x: x.text == 'true')
    name = xml_property('name')
    url = xml_property('url')
    type = xml_property('type')

    writers = dict(enabled=write_bool('enabled'), name=write_string('name'),
                   url=write_string('url'), type=write_string('type'))

    def get_resources(self):
        res_url = url(self.catalog.service_url, ['workspaces',
                      self.workspace.name, 'coveragestores', self.name,
                      'coverages.xml'])

        xml = self.catalog.get_xml(res_url)

        def cov_from_node(node):
            return coverage_from_index(self.catalog, self.workspace, self,
                                       node)

        return [cov_from_node(node) for node in xml.findall('coverage')]


class UnsavedCoverageStore(CoverageStore):

    save_method = 'POST'

    def __init__(self, catalog, name, workspace):
        super(UnsavedCoverageStore, self).__init__(catalog, workspace, name)
        self.dirty.update(name=name, enabled=True, type='GeoTIFF',
                          url='file:data/')

    @property
    def href(self):
        return url(self.catalog.service_url, ['workspaces',
                   self.workspace.name, 'coveragestores'],
                   dict(name=self.name))
