package de.ivu.elect.presentation.ergebnis;

import de.ivu.elect.business.ergebnis.control.SitzeByAnzahlAbsteigendComparator;
import de.ivu.elect.business.ergebnis.entity.Sitze;
import de.ivu.elect.presentation.ergebnis.table.AbstractSitzeColumn;
import de.ivu.elect.presentation.ergebnis.table.SitzeColumnBuilder;
import de.ivu.elect.presentation.ergebnis.table.SitzeGruppeFarbeColumn;
import de.ivu.elect.presentation.ergebnis.table.SitzeGruppeKurznameColumn;
import org.primefaces.model.charts.ChartData;
import org.primefaces.model.charts.donut.DonutChartDataSet;
import org.primefaces.model.charts.donut.DonutChartModel;
import org.primefaces.model.charts.donut.DonutChartOptions;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;


public class SitzeDonutChartModelBuilder {
    private SitzeColumnBuilder sitzeColumnBuilder;


    public SitzeDonutChartModelBuilder(SitzeColumnBuilder sitzeColumnBuilder) {
        this.sitzeColumnBuilder = sitzeColumnBuilder;
    }

    protected DonutChartModel getChartModel(List<Sitze> serachResult) {
        sitzeColumnBuilder.initColumns();

        SitzeGruppeKurznameColumn kurznameColumnBuilder = sitzeColumnBuilder.getSitzeGruppeKurznameColumn();
        AbstractSitzeColumn<Sitze> sitzeAnzahlColumn = sitzeColumnBuilder.getSitzeAnzahlColumn();
        SitzeGruppeFarbeColumn sitzeGruppeFarbeColumn = sitzeColumnBuilder.getSitzeGruppeFarbeColumn();

        DonutChartOptions options = new DonutChartOptions();
        options.setCutoutPercentage(25);
        // BUG IN PF überschreibt cutoutpercentage... options.setCircumference(3.141592653589793);
        options.setRotation(-3.141592653589793);

        ChartData data = new ChartData();
        DonutChartModel pieChartJsModel = new DonutChartModel(data, options);

        pieChartJsModel.setExtender("function () { this.cfg.config.options.circumference=3.141592653589793; if (!this.cfg.config.options.legend) {this.cfg.config.options.legend={}};this.cfg.config.options.legend.position = 'bottom'; }");

        DonutChartDataSet dataSet = new DonutChartDataSet();
        List<Number> values = new ArrayList<>();
        dataSet.setData(values);
        List<String> bgColors = new ArrayList<>();
        dataSet.setBackgroundColor(bgColors);
        data.addChartDataSet(dataSet);
        List<String> labels = new ArrayList<>();
        data.setLabels(labels);

        for (Sitze sitze : filterUndSortiereFuerDonut(serachResult)) {
            values.add(sitze.getAnzahl());
            labels.add(notNull(kurznameColumnBuilder.getDisplayValue(sitze)) +" ("+sitze.getAnzahl()+")");
            bgColors.add("#"+sitzeGruppeFarbeColumn.getDisplayValue(sitze));
        }

        pieChartJsModel.setData(data);
        return pieChartJsModel;
    }

    private List<Sitze> filterUndSortiereFuerDonut(List<Sitze> searchResult) {
        return searchResult.stream().filter(sitze -> sitze.getAnzahl() > 0L).sorted(new SitzeByAnzahlAbsteigendComparator()).collect(Collectors.toCollection(() -> new ArrayList<>(searchResult.size())));
    }

    private String notNull(Object displayValue) {
        if (displayValue == null) {
            return "";
        }

        return displayValue.toString();
    }
}
