/* -*-c++-*- */
/* osgEarth - Geospatial SDK for OpenSceneGraph
* Copyright 2019 Pelican Mapping
* http://osgearth.org
*
* osgEarth is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program.  If not, see <http://www.gnu.org/licenses/>
*/

#ifndef OSGEARTHUTIL_WFS_H
#define OSGEARTHUTIL_WFS_H 1

#include <osgEarthUtil/Common>
#include <osgEarth/GeoData>
#include <osgEarth/URI>
#include <osg/Referenced>
#include <osg/ref_ptr>

#include <osgDB/ReaderWriter>
#include <osg/Version>
#include <osgDB/Options>


#include <string>
#include <vector>

namespace osgEarth { namespace Util
{
    class OSGEARTHUTIL_EXPORT WFSFeatureType : public osg::Referenced
    {
    public:
        WFSFeatureType();

        /** dtor */
        virtual ~WFSFeatureType() { }

        const std::string& getName() const { return _name;}
        void setName(const std::string& name) { _name = name;}

        const std::string& getTitle() const { return _title;}
        void setTitle(const std::string& title) { _title = title;}

        const std::string& getSRS() const { return _srs;}
        void  setSRS(const std::string& srs) { _srs = srs; }

        const std::string& getAbstract() const { return _abstract;}
        void setAbstract(const std::string& abstract) { _abstract = abstract; }

        const GeoExtent& getExtent() const { return _extent;}
        void setExtent(const GeoExtent& extent) { _extent = extent;}

        int getMaxLevel() const { return _maxLevel;}
        void setMaxLevel( int maxLevel ) { _maxLevel = maxLevel; }

        int getFirstLevel() const { return _firstLevel;}
        void setFirstLevel( int firstLevel ) { _firstLevel = firstLevel; }

        bool getTiled() const { return _tiled;}
        void setTiled(bool tiled) { _tiled = tiled;}
        
    private:
        std::string _name;
        std::string _title;
        std::string _srs;
        std::string _abstract;
        GeoExtent   _extent;
        bool        _tiled;
        int         _maxLevel;
        int         _firstLevel;
    };

    typedef std::vector< osg::ref_ptr< WFSFeatureType > > FeatureTypeList;

    

    /**
    *WFS Capabilities
    */
    class OSGEARTHUTIL_EXPORT WFSCapabilities : public osg::Referenced
    {
    public:
        WFSCapabilities();

        /** dtor */
        virtual ~WFSCapabilities() { }

        /**
        *Gets the WFS capabilities version
        */
        const std::string& getVersion() const {return _version;}

        /**
        *Sets the WFS capabilities version
        */
        void setVersion(const std::string& version) {_version = version;}        

        const std::string& getName() const { return _name; }
        void setName(const std::string& name) { _name = name; }

        const std::string& getTitle() const { return _title;}
        void setTitle(const std::string& title) { _title = title;}

        const std::string& getAbstract() const { return _abstract; }
        void setAbstract( const std::string& abstract) { _abstract = abstract; }

        WFSFeatureType* getFeatureTypeByName(const std::string& name);

        FeatureTypeList& getFeatureTypes() { return _featureTypes; }

                
    protected:
        FeatureTypeList _featureTypes;

        std::string _version;
        std::string _name;
        std::string _title;
        std::string _abstract;
    };

    /*
    * Reads Capabilities from a URL or file
    */
    class OSGEARTHUTIL_EXPORT WFSCapabilitiesReader
    {
    public:
        static WFSCapabilities* read( const URI& uri, const osgDB::Options* options );
        static WFSCapabilities* read( std::istream &in );
    private:
        WFSCapabilitiesReader(){}
        WFSCapabilitiesReader(const WFSCapabilitiesReader &cr){}

        /** dtor */
        virtual ~WFSCapabilitiesReader() { }
    };

} } // namespace osgEarth::Util

#endif //OSGEARTHUTIL_WFS_H
