package com.company.demo1.view.chartdemo;


import com.company.demo1.view.main.MainView;
import com.vaadin.flow.component.ClickEvent;
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
import com.vaadin.flow.router.Route;
import io.jmix.chartsflowui.component.Chart;
import io.jmix.chartsflowui.data.item.MapDataItem;
import io.jmix.chartsflowui.kit.component.model.DataSet;
import io.jmix.chartsflowui.kit.component.model.Title;
import io.jmix.chartsflowui.kit.component.model.legend.Legend;
import io.jmix.chartsflowui.kit.data.chart.ListChartItems;
import io.jmix.core.DataManager;
import io.jmix.core.entity.KeyValueEntity;
import io.jmix.flowui.kit.component.button.JmixButton;
import io.jmix.flowui.model.KeyValueCollectionContainer;
import io.jmix.flowui.view.*;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.*;

@Route(value = "chart-demo-view", layout = MainView.class)
@ViewController(id = "demo_ChartDemoView")
@ViewDescriptor(path = "chart-demo-view.xml")
public class ChartDemoView extends StandardView {

    @Autowired
    protected DataManager dataManager;
    @ViewComponent
    private Chart chart;
    @ViewComponent
    private KeyValueCollectionContainer vehiclesDc;
    @ViewComponent
    protected Chart pie;
    @ViewComponent
    private Chart funnel;
    @ViewComponent
    private VerticalLayout tableBox;
    @ViewComponent
    private VerticalLayout pieBox;

    @Subscribe
    public void onInit(final InitEvent event) {
        chart.setLegend(new Legend().withTop("0"));
        chart.setTitle(new Title().withText("Vehicles").withSubtext("By Year"));

        List<KeyValueEntity> list = new ArrayList<>();
        KeyValueEntity kv1 = dataManager.create(KeyValueEntity.class);
        kv1.setValue("year", 2025);
        kv1.setValue("cars", 10000);
        kv1.setValue("motorcycles", 5000);
        kv1.setValue("bicycles", 300);
        list.add(kv1);
        KeyValueEntity kv2 = dataManager.create(KeyValueEntity.class);
        kv2.setValue("year", 2024);
        kv2.setValue("cars", 12000);
        kv2.setValue("motorcycles", 5700);
        kv2.setValue("bicycles", 700);
        list.add(kv2);
        KeyValueEntity kv3 = dataManager.create(KeyValueEntity.class);
        kv3.setValue("year", 2023);
        kv3.setValue("cars", 9000);
        kv3.setValue("motorcycles", 400);
        kv3.setValue("bicycles", 800);
        list.add(kv3);
        vehiclesDc.setItems(list);

        ListChartItems<MapDataItem> items = new ListChartItems<>(
                new MapDataItem(Map.of("category", "Completed", "value", 30)),
                new MapDataItem(Map.of("category", "Not Started", "value", 5)),
                new MapDataItem(Map.of("category", "In Progress", "value", 45))
        );

        pie.setDataSet(
                new DataSet()
                        .withSource(
                                new DataSet.Source<MapDataItem>()
                                        .withDataProvider(items)
                                        .withCategoryField("category")
                                        .withValueField("value")
                        )
        );

        funnel.setDataSet(
                new DataSet()
                        .withSource(
                                new DataSet.Source<MapDataItem>()
                                        .withDataProvider(items)
                                        .withCategoryField("category")
                                        .withValueFields("value")
                        )
        );
    }

    @Subscribe(id = "showPieBtn", subject = "clickListener")
    public void onShowPieBtnClick(final ClickEvent<JmixButton> event) {
        pieBox.setVisible(true);
        tableBox.setVisible(false);
    }

    @Subscribe(id = "showTableBtn", subject = "clickListener")
    public void onShowTableBtnClick(final ClickEvent<JmixButton> event) {
        pieBox.setVisible(false);
        tableBox.setVisible(true);
    }

    @Subscribe(id = "hideBtn", subject = "clickListener")
    public void onHideBtnClick(final ClickEvent<JmixButton> event) {
        pieBox.setVisible(false);
        tableBox.setVisible(false);
    }
}