/*
 * This file is part of the Owl Positioning System (OwlPS) project.
 * It is subject to the copyright notice and license terms in the
 * COPYRIGHT.t2t file found in the top-level directory of this
 * distribution and at
 *   https://code.lm7.fr/mcy/owlps/src/master/COPYRIGHT.t2t
 * No part of the OwlPS Project, including this file, may be copied,
 * modified, propagated, or distributed except according to the terms
 * contained in the COPYRIGHT.t2t file; the COPYRIGHT.t2t file must be
 * distributed along with this file, either separately or by replacing
 * this notice by the COPYRIGHT.t2t file's contents.
 */


#ifndef _OWLPS_POSITIONING_MOBILE_HH_
#define _OWLPS_POSITIONING_MOBILE_HH_

class Request ;

#include "wifidevice.hh"
#include "resultlist.hh"

#include <ostream>

#define MOBILE_DEFAULT_ANTENNA_GAIN 2

/// Represents a mobile [Wi-Fi device](@ref WifiDevice) that can be
/// localised
class Mobile: public WifiDevice
{
private:
  /// Last request received from this mobile
  Request *last_request ;

  /** @name Write accessors */
  //@{
  /// Updates last_request from last_results
  void update_last_request(void) ;
  //@}

protected:
  /// Last results computed for this mobile
  ResultList last_results ;

public:
  Mobile(const std::string &_ip_addr = "",
         const std::string &_mac_addr = "",
         const float _antenna_gain = MOBILE_DEFAULT_ANTENNA_GAIN,
         const float _trx_power = WIFIDEVICE_DEFAULT_TRX_POWER):
    WifiDevice(_ip_addr, _mac_addr, _antenna_gain, _trx_power),
    last_request(nullptr) {}

  explicit Mobile(const WifiDevice &wd):
    WifiDevice(wd), last_request(nullptr) {}

  Mobile(const Mobile &m) ;

  ~Mobile(void) ;

  /** @name Read accessors */
  //@{
  const ResultList& get_last_results(void) const ;
  //@}

  /** @name Write accessors */
  //@{
  void set_last_results(const ResultList &_last_results) ;
  //@}

  /** @name Operators */
  //@{
  Mobile& operator=(const Mobile &m) ;
  bool operator==(const Mobile &m) const ;
  bool operator!=(const Mobile &m) const ;
  //@}

  /// Displays a Mobile
  friend std::ostream &operator<<(std::ostream &os, const Mobile &m) ;
} ;



/* *** Read accessors *** */


inline const ResultList& Mobile::get_last_results() const
{
  return last_results ;
}



/* *** Write accessors *** */


inline void Mobile::set_last_results(const ResultList &_last_results)
{
  last_results = _last_results ;
  update_last_request() ;
}



/* *** Operators *** */


inline bool Mobile::operator!=(const Mobile &m) const
{
  return !(*this == m) ;
}



#endif // _OWLPS_POSITIONING_MOBILE_HH_
