#include "WimaPlanData.h"

WimaPlanData::WimaPlanData(QObject *parent) : QObject(parent) {}

WimaPlanData::WimaPlanData(const WimaPlanData &other, QObject *parent)
    : QObject(parent) {
  *this = other;
}

WimaPlanData &WimaPlanData::operator=(const WimaPlanData &other) {
  this->set(other.measurementArea());
  this->set(other.serviceArea());
  this->set(other.joinedArea());
  this->set(other.corridor());

  return *this;
}

void WimaPlanData::set(const WimaJoinedAreaData &areaData) {
  if (_joinedArea != areaData) {
    _joinedArea = areaData;
    emit joinedAreaChanged();
  }
}

void WimaPlanData::set(const WimaServiceAreaData &areaData) {
  if (_serviceArea != areaData) {
    _serviceArea = areaData;
    emit serviceAreaChanged();
  }
}

void WimaPlanData::set(const WimaCorridorData &areaData) {
  if (_corridor != areaData) {
    _corridor = areaData;
    emit corridorChanged();
  }
}

void WimaPlanData::set(const WimaMeasurementAreaData &areaData) {
  if (_measurementArea != areaData) {
    _measurementArea = areaData;
    emit measurementAreaChanged();

    if (_measurementArea.coordinateList().size() > 0) {
      setOrigin(_measurementArea.coordinateList().first());
    } else {
      setOrigin(QGeoCoordinate());
    }
  }
}

void WimaPlanData::set(const WimaJoinedArea &areaData) {
  if (_joinedArea != areaData) {
    _joinedArea = areaData;
    emit joinedAreaChanged();
  }
}

void WimaPlanData::set(const WimaServiceArea &areaData) {
  if (_serviceArea != areaData) {
    _serviceArea = areaData;
    emit serviceAreaChanged();
  }
}

void WimaPlanData::set(const WimaCorridor &areaData) {
  if (_corridor != areaData) {
    _corridor = areaData;
    emit corridorChanged();
  }
}

void WimaPlanData::set(const WimaMeasurementArea &areaData) {
  if (_measurementArea != areaData) {
    _measurementArea = areaData;
    emit measurementAreaChanged();

    if (_measurementArea.coordinateList().size() > 0) {
      setOrigin(_measurementArea.coordinateList().first());
    } else {
      setOrigin(QGeoCoordinate());
    }
  }
}

void WimaPlanData::clear() { *this = WimaPlanData(); }

QGeoCoordinate WimaPlanData::origin() { return _origin; }

bool WimaPlanData::isValid() {
  return _measurementArea.coordinateList().size() >= 3 &&
         _serviceArea.coordinateList().size() >= 3 && _origin.isValid();
}

const WimaJoinedAreaData &WimaPlanData::joinedArea() const {
  return this->_joinedArea;
}

const WimaServiceAreaData &WimaPlanData::serviceArea() const {
  return this->_serviceArea;
}

const WimaCorridorData &WimaPlanData::corridor() const {
  return this->_corridor;
}

const WimaMeasurementAreaData &WimaPlanData::measurementArea() const {
  return this->_measurementArea;
}

WimaJoinedAreaData &WimaPlanData::joinedArea() { return this->_joinedArea; }

WimaServiceAreaData &WimaPlanData::serviceArea() { return this->_serviceArea; }

WimaCorridorData &WimaPlanData::corridor() { return this->_corridor; }

WimaMeasurementAreaData &WimaPlanData::measurementArea() {
  return this->_measurementArea;
}

bool WimaPlanData::operator==(const WimaPlanData &other) const {
  return this->_joinedArea == other._joinedArea &&
         this->_measurementArea == other._measurementArea &&
         this->_corridor == other._corridor &&
         this->_serviceArea == other._serviceArea;
}
bool WimaPlanData::operator!=(const WimaPlanData &other) const {
  return !(*this == other);
}

void WimaPlanData::setOrigin(const QGeoCoordinate &origin) {
  if (this->_origin != origin) {
    this->_origin = origin;
    emit originChanged();
  }
}
