package _VisualDVM.ProjectData.SapforData.Regions.UI;
import Common.MainModule_;
import Common.Utils.Pair;
import Common.Visual.Tables.StyledCellLabel;
import _VisualDVM.Global;
import _VisualDVM.ProjectData.SapforData.Arrays.ProjectArray;
import _VisualDVM.ProjectData.SapforData.Regions.ParallelRegion;

import javax.swing.*;
import javax.swing.event.ChangeListener;
import java.util.LinkedHashMap;
public class ArrayAlignmentBar extends JToolBar {
    public ProjectArray array;
    public LinkedHashMap<Integer, Pair<JSpinner, JSpinner>> dimensions = new LinkedHashMap<>();
    public ArrayAlignmentBar(ProjectArray array_in) {
        array = array_in;
        array.bar = this;
        array.init_new_ac(); //набор коефициентов.
        this.setFloatable(false);
        //-
        StyledCellLabel label = new StyledCellLabel();
        label.setOpaque(false);
        label.setText(array.GetShortNameWithDimLetters() + " → " + array.align_template.shortName + " [ ");
        add(label);
        //---
        int i = 0;
        for (int dim : array.ac_current.keySet()) {
            if (array.ac_current.get(dim).active) {
                //просто идут подряд. четные - K, нечетные B
                JSpinner K = new DimensionSpinner(array.ac_current.get(dim).K);
                JSpinner B = new DimensionSpinner(array.ac_current.get(dim).B);
                dimensions.put(dim, new Pair<>(K, B));
                add(K);
                label = new StyledCellLabel();
                label.setOpaque(false);
                label.setText(" * " + array.ac_current.get(dim).getLetter() + " + ");
                add(label);
                add(B);
                label = new StyledCellLabel();
                label.setOpaque(false);
                label.setText((i < array.ac_current.keySet().size() - 1) ? " , " : " ]");
                add(label);
                ChangeListener changeListener = e -> {
                    //инфа о связях. из списка всех объявленных массивов.
                    ProjectArray d_array = Global.mainModule.getProject().declaratedArrays.get(array.id);
                    //опять же, берем инфу из объявлений!
                    for (ProjectArray d_link : d_array.links.values()) {
                        //это массивы из объявлений. прежде чем их трогать проверим а есть ли они в текущей области.
                        // по адресам принадлежность смотреть нельзя.
                        // на момент поиска массивов у них их еще нет. а вот ид совпадают.
                        ParallelRegion currentRegion = MainModule_.instance.getDb().getTable(ParallelRegion.class).getUI().getCurrent();
                        if (currentRegion.ArrayBelongsToRegion(d_link.id)) {
                            //инфа о массиве уже из области. имеющая адрес и бар.
                            ProjectArray r_link = currentRegion.getArrayById(d_link.id);
                            Pair<JSpinner, JSpinner> pair = r_link.bar.dimensions.get(dim);
                            pair.getKey().setValue(K.getValue());
                            pair.getValue().setValue(B.getValue());
                        }
                    }
                };
                K.addChangeListener(changeListener);
                B.addChangeListener(changeListener);
            }
            ++i;
        }
    }
    public void apply_changes() {
        for (int dim : dimensions.keySet()) {
            array.ac_new.get(dim).K = (int) dimensions.get(dim).getKey().getValue();
            array.ac_new.get(dim).B = (int) dimensions.get(dim).getValue().getValue();
        }
    }
}
