text: #include "data_controller.hpp"
  
  
  #include <stdexcept>
  
  namespace cvv
  {
  namespace impl
  {
  
  namespace
  {
  class CallEquality
  {
        public:
  	CallEquality(size_t Id) : Id{ Id }
  	{
  	}
  
  	bool operator()(const std::unique_ptr<Call> &call) const
  	{
  		return call->getId() == Id;
  	}
  
        private:
  	size_t Id;
  };
  }
  
  void DataController::addCall(std::unique_ptr<Call> call)
  {
  	auto ref = util::makeRef(*call);
  	calls.push_back(std::move(call));
  	viewController.addCall(ref);
  	callUI();
  }
  
  void DataController::removeCall(size_t Id)
  {
  	auto it = std::find_if(calls.begin(), calls.end(), CallEquality{ Id });
  	if (it == calls.end())
  	{
  		throw std::invalid_argument{ "there is no call with this id" };
  	}
  	calls.erase(it);
  }
  
  const Call &DataController::getCall(size_t Id) const
  {
  	auto it = std::find_if(calls.begin(), calls.end(), CallEquality{ Id });
  	if (it == calls.end())
  	{
  		throw std::invalid_argument{ "there is no call with this id" };
  	}
  	return **it;
  }
  
  Call &DataController::getCall(size_t Id)
  {
  	auto it = std::find_if(calls.begin(), calls.end(), CallEquality{ Id });
  	if (it == calls.end())
  	{
  		throw std::invalid_argument{ "there is no call with this id" };
  	}
  	return **it;
  }
  
  bool DataController::hasCall(size_t Id)
  {
  	auto it = std::find_if(calls.begin(), calls.end(), CallEquality{ Id });
  	return it != calls.end();
  }
  
  size_t DataController::numCalls() const
  {
  	return calls.size();
  }
  
  void DataController::callUI()
  {
  	viewController.exec();
  }
  
  void DataController::lastCall()
  {
  	viewController.showExitProgramButton();
  	callUI();
  }
  
  /**
   * @brief Actual implementation of the global DataController.
   *
   * This is required to be able to delete it.
   */
  static std::unique_ptr<DataController> &realSingleton()
  {
  	static std::unique_ptr<DataController> var = nullptr;
  	return var;
  }
  
  void deleteDataController()
  {
  	realSingleton().reset();
  }
  
  DataController &dataController()
  {
  	auto& controller = realSingleton();
  	if(!realSingleton().get())
  	{
  		controller = util::make_unique<DataController>();
  	}
  	return *controller;
  }
  }
  } // namespaces cvv::impl
  