/* +---------------------------------------------------------------------------+
   |                     Mobile Robot Programming Toolkit (MRPT)               |
   |                          https://www.mrpt.org/                            |
   |                                                                           |
   | Copyright (c) 2005-2023, Individual contributors, see AUTHORS file        |
   | See: https://www.mrpt.org/Authors - All rights reserved.                  |
   | Released under BSD License. See details in https://www.mrpt.org/License   |
   +---------------------------------------------------------------------------+
   */
#include "CGasGridConfig.h"

#include "TypeOfConfig.h"
#include "ui_CGasGridConfig.h"

using namespace mrpt;
using namespace maps;

CGasGridConfig::CGasGridConfig()
	: CBaseConfig(), m_ui(std::make_unique<Ui::CGasGridConfig>())
{
	m_ui->setupUi(this);
	auto* def = new CGasConcentrationGridMap2D::TMapDefinition();
	setCreationOpt(
		def->min_x, def->max_x, def->min_y, def->max_y, def->resolution);
	setInsertOpt(def->insertionOpts);
}

const QString CGasGridConfig::getName()
{
	return QString::fromStdString(typeToName(TypeOfConfig::GasGrid));
}

void CGasGridConfig::updateConfiguration(
	mrpt::maps::TMetricMapInitializer* options)
{
	auto* mapDefination =
		dynamic_cast<CGasConcentrationGridMap2D::TMapDefinition*>(options);
	ASSERT_(mapDefination);

	Q_UNUSED(options);
	mapDefination->min_x = m_ui->min_x->value();
	mapDefination->max_x = m_ui->max_x->value();
	mapDefination->min_y = m_ui->min_y->value();
	mapDefination->max_y = m_ui->max_y->value();
	mapDefination->resolution = m_ui->resolution->value();

	mapDefination->insertionOpts.gasSensorLabel =
		m_ui->gasSensorLabel->text().toStdString();
	mapDefination->insertionOpts.enose_id = m_ui->enose_id->value();
	mapDefination->insertionOpts.gasSensorType = m_ui->gasSensorType->value();
	mapDefination->insertionOpts.windSensorLabel =
		m_ui->windSensorLabel->text().toStdString();

	mapDefination->insertionOpts.useWindInformation =
		m_ui->useWindInformation->isChecked();
	mapDefination->insertionOpts.advectionFreq = m_ui->advectionFreq->value();
	mapDefination->insertionOpts.std_windNoise_phi =
		m_ui->std_windNoise_phi->value();
	mapDefination->insertionOpts.std_windNoise_mod =
		m_ui->std_windNoise_mod->value();
	mapDefination->insertionOpts.default_wind_direction =
		m_ui->default_wind_direction->value();
	mapDefination->insertionOpts.default_wind_speed =
		m_ui->default_wind_speed->value();
}

TypeOfConfig CGasGridConfig::type() const { return TypeOfConfig::GasGrid; }
void CGasGridConfig::setCreationOpt(
	float min_x, float max_x, float min_y, float max_y, float resolution)
{
	m_ui->min_x->setValue(min_x);
	m_ui->max_x->setValue(max_x);
	m_ui->min_y->setValue(min_y);
	m_ui->max_y->setValue(max_y);
	m_ui->resolution->setValue(resolution);
}

void CGasGridConfig::setInsertOpt(
	const mrpt::maps::CGasConcentrationGridMap2D::TInsertionOptions& insertOpt)
{
	m_ui->gasSensorLabel->setText(
		QString::fromStdString(insertOpt.gasSensorLabel));
	m_ui->enose_id->setValue(insertOpt.enose_id);
	m_ui->gasSensorType->setValue(insertOpt.gasSensorType);
	m_ui->windSensorLabel->setText(
		QString::fromStdString(insertOpt.windSensorLabel));

	m_ui->useWindInformation->setChecked(insertOpt.useWindInformation);
	m_ui->advectionFreq->setValue(insertOpt.advectionFreq);
	m_ui->std_windNoise_phi->setValue(insertOpt.std_windNoise_phi);
	m_ui->std_windNoise_mod->setValue(insertOpt.std_windNoise_mod);
	m_ui->default_wind_direction->setValue(insertOpt.default_wind_direction);
	m_ui->default_wind_speed->setValue(insertOpt.default_wind_speed);
}

void CGasGridConfig::setMapTypeOpt(
	const mrpt::maps::CRandomFieldGridMap2D::TMapRepresentation& /*mapType*/)
{
}
