/* -*-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 OSGEARTH_MAP_OPTIONS_H
#define OSGEARTH_MAP_OPTIONS_H 1

#include <osgEarth/Common>
#include <osgEarth/Config>
#include <osgEarth/Cache>
#include <osgEarth/CachePolicy>
#include <osgEarth/GeoCommon>
#include <osgEarth/Profile>

namespace osgEarth
{
    /**
     * Configuration for a runtime map.
     */
    class OSGEARTH_EXPORT MapOptions : public ConfigOptions
    {
    public:
        enum CoordinateSystemType
        {
            CSTYPE_GEOCENTRIC,
            CSTYPE_GEOCENTRIC_CUBE,
            CSTYPE_PROJECTED
        };		

    public:
        //! Construct from serialized config options
        MapOptions( const ConfigOptions& options =ConfigOptions() )
            : ConfigOptions          ( options ),
              _cachePolicy           ( ),
              _cstype                ( CSTYPE_GEOCENTRIC ),
              _elevationInterpolation( INTERP_BILINEAR )
        {
            fromConfig(_conf);
        }

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

        /**
         * Human-readable name of the map.
         */
        optional<std::string>& name() { return _name; }
        const optional<std::string>& name() const { return _name; }

        /**
         * The coordinate system type of the map.
         * By default this is "geocentric" (round earth), unless you specify a profile
         * below, in which case it will be "projected" if the profile contains a 
         * projected SRS.
         */
        optional<CoordinateSystemType>& coordSysType() { return _cstype; }
        const optional<CoordinateSystemType>& coordSysType() const { return _cstype; }

        /**
         * An explicit master profile for the Map. Usually this is calculated automatically,
         * but in some cases you need to set it manually.
         */
        optional<ProfileOptions>& profile() { return _profileOptions; }
        const optional<ProfileOptions>& profile() const { return _profileOptions; }

        /**
         * Caching setup for the entire map. By default, map layers added to the map will
         * inherit this setup unless they override or customize it with their own settings.
         */
        optional<CacheOptions>& cache() { return _cacheOptions; }
        const optional<CacheOptions>& cache() const { return _cacheOptions; }

        /**
         * Default cache policy that propagates to each layer.
         */
        optional<CachePolicy>& cachePolicy() { return _cachePolicy; }
        const optional<CachePolicy>& cachePolicy() const { return _cachePolicy; }

         /**
         * The interpolation method to use when sampling heightfields.
         */
        optional<ElevationInterpolation>& elevationInterpolation(void) { return _elevationInterpolation; }
        const optional<ElevationInterpolation>& elevationInterpolation(void) const { return _elevationInterpolation;}
    
    public:
        Config getConfig() const;

        void mergeConfig( const Config& conf ) {
            ConfigOptions::mergeConfig( conf );
            fromConfig( conf );
        }

    private:
        void fromConfig( const Config& conf );

        optional<std::string>            _name;
        optional<ProfileOptions>         _profileOptions;
        optional<CacheOptions>           _cacheOptions;
        optional<CachePolicy>            _cachePolicy;
        optional<CoordinateSystemType>   _cstype;
        optional<ElevationInterpolation> _elevationInterpolation;
    };
}

#endif // OSGEARTH_MAP_ENGINE_PROPERTIES_H
