/* -*-c++-*- */
/* osgEarth - Dynamic map generation toolkit for OpenSceneGraph
* Copyright 2008-2014 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.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU Lesser General Public License for more details.
*
* 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 OSGEARTH_AERODROME_BOUNDARYNODE
#define OSGEARTH_AERODROME_BOUNDARYNODE 1

#include <osg/Group>

#include "Common"
#include "AerodromeFeatureNode"
#include <osgEarth/Feature>

namespace osgEarth { namespace Aerodrome
{
    using namespace osgEarth;
    using namespace osgEarth::Aerodrome;

    /**
     * Boundary
     */
    class OSGEARTHAERODROME_EXPORT BoundaryNode : public AerodromeFeatureNode
    {
    public:
        BoundaryNode(const BoundaryFeatureOptions& options, const std::string& icao, double elevation, const osgEarth::Bounds Bounds, FeatureSource* featureSource, FeatureID fid) : AerodromeFeatureNode(options, icao, featureSource, fid), _elevation(elevation), _hasElevation(true), _boundaryOptions(options) { }
        BoundaryNode(const BoundaryFeatureOptions& options, const std::string& icao, Feature* feature=0L) : AerodromeFeatureNode(options, icao, feature), _boundaryOptions(options), _hasElevation(false), _elevation(0.0) { }

        virtual ~BoundaryNode() { }
        
    public: // properties
        bool hasElevation()
        {
            if (_hasElevation || (_boundaryOptions.elevationAttr().isSet() && getFeature()->hasAttr(_boundaryOptions.elevationAttr().value())))
                return true;

            return false;
        }

        double elevation()
        {
            return hasElevation() ? _hasElevation ? _elevation : getFeature()->getDouble(_boundaryOptions.elevationAttr().value(), 0.0) : 0.0;
        }

    protected:
        BoundaryFeatureOptions _boundaryOptions;
        double _elevation;
        bool _hasElevation;
    };

    
    class OSGEARTHAERODROME_EXPORT BoundaryGroup : public osg::Group
    {
    public:
        BoundaryGroup() { }

        virtual ~BoundaryGroup() { }
    };

} } // namespace osgEarth::Aerodrome

#endif // OSGEARTH_AERODROME_BOUNDARYNODE
