#include "solver_impl.hpp"

namespace solver {

solver::TimeSettings make_time(solver::InputInfo ii,
                               std::vector<InputsMessage> &messages) {
  solver::TimeSettings time;

  auto dt_max = std::get<solver::NumberArray>(ii[DT_MAX]);
  if (dt_max.size() != 1) {
    require(DT_MAX, messages, 1);
  } else {
    time.dt_max = dt_max[0];
  }

  auto dt_min = std::get<solver::NumberArray>(ii[DT_MIN]);
  if (dt_min.size() != 1) {
    require(DT_MIN, messages, 1);
  } else {
    time.dt_min = dt_min[0];
  }

  auto maxstep = std::get<solver::NumberArray>(ii[MAXSTEP]);
  if (maxstep.size() != 1) {
    require(MAXSTEP, messages, 1);
  } else {
    time.max_step = maxstep[0];
  }

  if (!ii.count(TSTOP)) {
    require(TSTOP, messages, 0);
  }
  auto tstop = std::get<solver::NumberArray>(ii[TSTOP]);
  if (tstop.size() != 1) {
    require(TSTOP, messages, 1);
  } else {
    time.tstop = tstop[0];
  }

  auto fixed_dt = std::get<solver::NumberArray>(ii[FIXED_DT]);
  if (fixed_dt.size() != 1) {
    require(FIXED_DT, messages, 1);
  } else {
    time.fixed_dt = (fixed_dt[0] != 0);
  }

  auto cfl = std::get<solver::NumberArray>(ii[CFL]);
  if (cfl.size() != 1) {
    require(CFL, messages, 1);
  } else {
    time.cfl = cfl[0];
  }

  auto tcoll_ratio = std::get<solver::NumberArray>(ii[TCOLL_RATIO]);
  if (tcoll_ratio.size() != 1) {
    require(TCOLL_RATIO, messages, 1);
  } else {
    time.tcoll_ratio = tcoll_ratio[0];
  }

  return time;
}
} // namespace solver