#include <QVBoxLayout>
#include <QRadioButton>
#include <QLabel>

#include "synczoomwidget.hpp"
#include "../util/util.hpp"

namespace cvv
{
namespace qtutil
{

cvv::qtutil::SyncZoomWidget::SyncZoomWidget(
    std::vector<cvv::qtutil::ZoomableImage *> images, QWidget *parent)
    : QWidget(parent), images_{ images }, currentIdx_{ images_.size() },
      buttonGroup_{ new QButtonGroup }
{
	if (images_.size() >= 2)
	{

		auto layout = util::make_unique<QVBoxLayout>();
		auto label = util::make_unique<QLabel>("choose 'master' image");
		auto none = util::make_unique<QRadioButton>("no sync");

		buttonGroup_->setExclusive(true);
		none->setChecked(true);
		buttonGroup_->addButton(none.get(), images.size());

		layout->addWidget(label.release());
		layout->addWidget(none.release());

		for (size_t i = 0; i < images_.size(); i++)
		{

			auto checkbox = util::make_unique<QRadioButton>(QString
			{ "Image Nr. %1" }.arg(i));

			buttonGroup_->addButton(checkbox.get(), i);

			layout->addWidget(checkbox.release());

			connect(this, SIGNAL(updateArea(QRectF, qreal)),
				images_.at(i), SLOT(setArea(QRectF, qreal)));
		}
		connect(buttonGroup_, SIGNAL(buttonClicked(int)), this,
			SLOT(selectMaster(int)));

		setLayout(layout.release());
	}
}

void SyncZoomWidget::selectMaster(int id)
{
	if (currentIdx_ < images_.size())
	{
		disconnect(images_.at(currentIdx_),
			   SIGNAL(updateArea(QRectF, qreal)), this,
			   SIGNAL(updateArea(QRectF, qreal)));

		connect(this, SIGNAL(updateArea(QRectF, qreal)),
			images_.at(currentIdx_), SLOT(setArea(QRectF, qreal)));
	}
	currentIdx_ = id;
	if (currentIdx_ < images_.size())
	{
		disconnect(this, SIGNAL(updateArea(QRectF, qreal)),
			   images_.at(currentIdx_),
			   SLOT(setArea(QRectF, qreal)));

		connect(images_.at(currentIdx_),
			SIGNAL(updateArea(QRectF, qreal)), this,
			SIGNAL(updateArea(QRectF, qreal)));
	}
}
}
}