//
// Created by mark on 8/17/25.
//

#include <ReportsAndCharts/BarLineLineChart.h>

#include <Wt/WFitLayout.h>

BarLineLineChart::BarLineLineChart(const std::shared_ptr<Wt::WStandardItemModel>& barLineLineData, std::string &chartTitle) : barLineLineData_(barLineLineData) {

	auto chartContainerLayout = setLayout(std::make_unique<Wt::WFitLayout>());
	auto chartJS = std::make_unique<WChartJSLibrary>(ChartJSType::LINE);
	barLineLineChart_ = chartContainerLayout->addWidget(std::move(chartJS));
	// barLineLineChart_ = addWidget(std::move(chartJS));
	chartOptions_ = std::make_unique<WChartJSOptions>(ChartJSType::LINE);
	barDataSeries_ = std::make_unique<WChartJSDataSeries>(ChartJSType::BAR);
	lineDataSeries1_ = std::make_unique<WChartJSDataSeries>(ChartJSType::LINE);
	lineDataSeries2_ = std::make_unique<WChartJSDataSeries>(ChartJSType::LINE);

	barLineLineChart_->setModel(barLineLineData_);

	yScalesOptions_.axisOptions.axis = "y";
	yScalesOptions_.axisOptions.type = "linear";
	pluginOptions_.zoomAndPan.wheelEnabled = true;
	pluginOptions_.zoomAndPan.pinchEnabled = true;
	WChartJSOptions::TickOptions axisTickOptions;
	axisTickOptions.display = true;

	lineDataSeries1_->setBorderWidth(3);
	lineDataSeries1_->setTension(0.5);
	lineDataSeries1_->setIndexAxis("x");
	lineDataSeries1_->setPointRadius(0);
	lineDataSeries1_->setLineBarCircleSeriesBorderColor(CURIOUS_CORAL);

	lineDataSeries2_->setBorderWidth(3);
	lineDataSeries2_->setTension(0.5);
	lineDataSeries2_->setIndexAxis("x");
	lineDataSeries2_->setPointRadius(0);
	lineDataSeries2_->setLineBarCircleSeriesBorderColor(OPTIMISTIC_GOLD);

	barDataSeries_->setBorderWidth(3);
	barDataSeries_->setLineBarCircleSeriesColor(OPTIMISTIC_GOLD);
	barDataSeries_->setLineBarCircleSeriesBorderColor(INSPIRING_TEAL);
	barDataSeries_->setHeaderTextPosition(HeaderText::VERTICAL);

	chartOptions_->setResponsive(true);
	chartOptions_->setMaintainAspectRatio(false);
	pluginOptions_.title.display = true;
	pluginOptions_.title.text = chartTitle;

	pluginOptions_.legend.position = "bottom";

	chartOptions_->setXScales(xScalesOptions_);
	chartOptions_->setPlugins(pluginOptions_);
	barLineLineChart_->setOptions(chartOptions_->getOptions());

	barLineLineChart_->addSeries(0,false,barDataSeries_->getJson(), false);
	barLineLineChart_->addSeries(1,true,lineDataSeries1_->getJson(), false);
	barLineLineChart_->addSeries(2,true,lineDataSeries2_->getJson(), false);

	barLineLineChart_->buildAndShowChart();
}

BarLineLineChart::~BarLineLineChart() = default;
