/**
******************************************************************************
*
* @file       pointlatlng.h
* @author     The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010.
* @brief      
* @see        The GNU Public License (GPL) Version 3
* @defgroup   OPMapWidget
* @{
* 
*****************************************************************************/
/* 
* 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 3 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 General Public License 
* for more details.
* 
* You should have received a copy of the GNU General Public License along 
* with this program; if not, write to the Free Software Foundation, Inc., 
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef POINTLATLNG_H
#define POINTLATLNG_H

#include <QHash>
#include <QString>
#include "sizelatlng.h"
 
namespace internals {
struct PointLatLng
{
    //friend uint qHash(PointLatLng const& point);
    friend bool operator==(PointLatLng const& lhs,PointLatLng const& rhs);
    friend bool operator!=(PointLatLng const& left, PointLatLng const& right);
    friend PointLatLng operator+(PointLatLng pt, SizeLatLng sz);
    friend PointLatLng operator-(PointLatLng pt, SizeLatLng sz);

   //TODO Sizelatlng friend PointLatLng operator+(PointLatLng pt, SizeLatLng sz);

   private:
    double lat;
    double lng;
    bool empty;
   public:
    PointLatLng();


    static PointLatLng Empty;

      PointLatLng(const double &lat,const double &lng)
      {
         this->lat = lat;
         this->lng = lng;
         empty=false;
      }

      bool IsEmpty()
      {
            return empty;
      }

      double Lat()const
      {
          return this->lat;
      }

      void SetLat(const double &value)
      {
          this->lat = value;
          empty=false;
      }


      double Lng()const
      {
          return this->lng;
      }
      void SetLng(const double &value)
      {
          this->lng = value;
          empty=false;
      }





      static PointLatLng Add(PointLatLng const& pt, SizeLatLng const& sz)
      {
         return PointLatLng(pt.Lat() - sz.HeightLat(), pt.Lng() + sz.WidthLng());
      }

      static PointLatLng Subtract(PointLatLng const& pt, SizeLatLng const& sz)
      {
         return PointLatLng(pt.Lat() + sz.HeightLat(), pt.Lng() - sz.WidthLng());
      }


      void Offset(PointLatLng const& pos)
      {
         this->Offset(pos.Lat(), pos.Lng());
      }

      void Offset(double const& lat, double const& lng)
      {
         this->lng += lng;
         this->lat -= lat;
      }


      QString ToString()const
      {
         return QString("{Lat=%1, Lng=%2}").arg(this->lat).arg(this->lng);
      }

////      static PointLatLng()
////      {
////         Empty = new PointLatLng();
////      }
   };


//
}
#endif // POINTLATLNG_H