/* -*-c++-*- */
/* osgEarth - Dynamic map generation toolkit for OpenSceneGraph
* Copyright 2016 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 OSGEARTH_ANNOTATION_RECTANGLE_NODE_H
#define OSGEARTH_ANNOTATION_RECTANGLE_NODE_H 1

#include <osgEarthAnnotation/GeoPositionNode>
#include <osgEarthSymbology/Style>
#include <osgEarth/MapNode>
#include <osgEarth/Units>

namespace osgEarth { namespace Annotation
{	
    using namespace osgEarth;
    using namespace osgEarth::Symbology;

    /**
     * Rectangle annotation.
     */
    class OSGEARTHANNO_EXPORT RectangleNode : public GeoPositionNode
    {
    public:
        enum Corner
        {
            CORNER_LOWER_LEFT,
            CORNER_LOWER_RIGHT,
            CORNER_UPPER_LEFT,
            CORNER_UPPER_RIGHT
        };

        META_AnnotationNode( osgEarthAnnotation, RectangleNode );

        /**
         * Constructs a new rectangle annotation.
         *
         * @param mapNode     Map on which the rectangle will appear
         * @param position    Location of the annotation, in map coordinates
         * @param width       Rectangle width
         * @param height      Rectangle height
         * @param style       Style defining how the annotation will look
         * @param draped      Whether to "drape" the annotation down on to the terrain         
         */
        RectangleNode(
            MapNode*          mapNode,
            const GeoPoint&   position,
            const Linear&     width,
            const Linear&     height,
            const Style&      style );

        virtual ~RectangleNode() { }

        /**
         * Gets the width of this rectangle
         */
        const Linear& getWidth() const;

        /**
         * Gets the height of this rectangle
         */
        const Linear& getHeight() const;

        /**
         * Sets the width of this rectangle
         * @param width The width of the rectangle
         */
        void setWidth( const Linear& width );

        /**
         * Sets the height of this rectangle
         * @param height   The height of the rectangle
         */
        void setHeight( const Linear& height );

        /**
         * Sets the size of the rectangle
         * @param width         The width of the rectangle
         * @param height        The height of the rectangle
         */
        void setSize( const Linear& width, const Linear& height);

        /**
         * Gets the style
         */
        const Style& getStyle() const;

        /**
         * Sets the style
         */
        void setStyle( const Style& style );        

        GeoPoint getUpperLeft() const;
        void setUpperLeft( const GeoPoint& upperLeft );

        GeoPoint getUpperRight() const;
        void setUpperRight( const GeoPoint& upperRight );

        GeoPoint getLowerLeft() const;
        void setLowerLeft( const GeoPoint& lowerLeft );

        GeoPoint getLowerRight() const;
        void setLowerRight( const GeoPoint& lowerRight );

        GeoPoint getCorner( Corner corner ) const;
        void setCorner( Corner corner, const GeoPoint& location);

    public:

        RectangleNode(MapNode* mapNode, const Config& conf, const osgDB::Options* options);
        virtual Config getConfig() const;

    private:
        RectangleNode() { }
        RectangleNode(const RectangleNode& rhs, const osg::CopyOp& op) { }

        void rebuild();

        Style  _style;
        Linear _width;
        Linear _height;
    };

} } // namespace osgEarth::Annotation

#endif // OSGEARTH_ANNOTATION_RECTANGLE_NODE_H
