package _VisualDVM.Visual.Windows;
import Common.Utils.Utils_;
import Common.Visual.Controls.MenuBarButton;
import _VisualDVM.Constants;
import _VisualDVM.Current;
import _VisualDVM.Global;
import _VisualDVM.Passes.PassCode;
import _VisualDVM.ProjectData.Files.ProjectFile;
import _VisualDVM.TestingSystem.SAPFOR.Json.SapforVersion_json;
import _VisualDVM.Utils;

import javax.swing.*;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.Vector;
public class SapforVersionsComparisonForm extends ComparisonForm<SapforVersion_json> {
    private final JComboBox<ProjectFile> cbFile;
    //--
    protected LinkedHashMap<SapforVersionComparisonState, JButton> buttons = null;
    protected ProjectFile file = null;
    //почти полный клон VersionsComparsionForm. В будущем нужен рефакторинг. Наверное.
    Current current;
    public SapforVersionsComparisonForm(SapforVersionsComparisonForm slave_in, Current current_in) {
        super(SapforVersion_json.class, slave_in);
        current = current_in;
        bApplyObject.setVisible(false);
        bClose.setVisible(false);
        cbFile = new JComboBox<>();
        tools.add(Global.mainModule.getPass(
                (current.equals(Current.SapforEtalonVersion) ? PassCode.OpenSapforEtalonVersion : PassCode.OpenSapforVersion
                )).createButton(), 3);
        tools.add(cbFile, 4);
        //--
        cbFile.addActionListener(e -> {
            SelectFile(((cbFile.getSelectedItem() instanceof ProjectFile) ? ((ProjectFile) cbFile.getSelectedItem()) : null));
        });
        //--
        buttons = new LinkedHashMap<>();
        int i = 5;
        for (SapforVersionComparisonState state : SapforVersionComparisonState.values()) {
            MenuBarButton button = new MenuBarButton();
            button.setIcon("/icons/" + state.toString() + ".png");
            button.setToolTipText(state.getDescription());
            button.addActionListener(e -> {
                if (object != null) {
                    ProjectFile projectFile = null;
                    switch (state) {
                        case CompilationOutput:
                            projectFile = object.parse_out;
                            break;
                        case CompilationErrors:
                            projectFile = object.parse_err;
                            break;
                        case RunOutput:
                            projectFile = object.out;
                            break;
                        case RunErrors:
                            projectFile = object.err;
                            break;
                    }
                    SelectFile(projectFile);
                }
            });
            tools.add(button, i);
            buttons.put(state, button);
            ++i;
        }
    }
    private SapforVersionsComparisonForm getMaster() {
        return (SapforVersionsComparisonForm) master;
    }
    private SapforVersionsComparisonForm getSlave() {
        return (SapforVersionsComparisonForm) slave;
    }
    public void SelectFile(ProjectFile file_in) {
        file = file_in;
        if (isMaster()) {
            if (isReady() && !getSlave().selectSameFile(file))
                DoShowPass(true);
        } else {
            if (isReady()) {
                if (getMaster().isReady()) {
                    boolean ExtensionsOn = (Global.normalProperties.ExtensionsOn);
                    String name1 = ExtensionsOn ? getMaster().file.file.getName() : Utils_.getFileNameWithoutExtension(getMaster().file.file);
                    String name2 = ExtensionsOn ? file.file.getName() : Utils_.getFileNameWithoutExtension(file.file);
                    if (Global.normalProperties.ComparsionDiffMergeOn) {
                        if (name1.equalsIgnoreCase(name2))
                            master.DoComparePass(true);
                    } else
                        master.DoShowPass(true);
                } else {
                    master.DoShowPass(true);
                }
            }
        }
    }
    @Override
    protected String getText() {
        return isReady() ?
                (file.file.exists() ? Utils.ReadAllText(file.file) : "файл не найден")
                : "объект не назначен";
    }
    @Override
    public boolean isReady() {
        return super.isReady() && file != null;
    }
    @Override
    public Object getDefaultCurrentObject() {
        return Global.mainModule.get(current);
    }
    @Override
    protected void showObject() {
        lObjectName.setText(object.Home.getName());
        lObjectName.setToolTipText(object.Home.getName() + " : " + Utils_.Brackets(object.description));
        cbFile.removeAllItems();
        for (ProjectFile file : object.files.values())
            cbFile.addItem(file);
    }
    @Override
    protected void removeObject() {
        cbFile.removeAllItems();
        file = null;
    }
    public boolean selectSameFile(ProjectFile file_in) {
        file = null;
        Vector<String> data_names = new Vector<>(Arrays.asList(
                Constants.parse_out_file,
                Constants.parse_err_file,
                Constants.out_file,
                Constants.err_file));
        String file_name = file_in.file.getName();
        if (data_names.contains(file_name)) {
            SapforVersionComparisonState state = null;
            switch (file_name) {
                case Constants.parse_out_file:
                    state = SapforVersionComparisonState.CompilationOutput;
                    break;
                case Constants.parse_err_file:
                    state = SapforVersionComparisonState.CompilationErrors;
                    break;
                case Constants.out_file:
                    state = SapforVersionComparisonState.RunOutput;
                    break;
                case Constants.err_file:
                    state = SapforVersionComparisonState.RunErrors;
                    break;
            }
            if (state != null) {
                buttons.get(state).doClick();
            }
            return isReady();
        } else {
            cbFile.setSelectedIndex(-1);
            for (int i = 0; i < cbFile.getItemCount(); ++i) {
                ProjectFile projectFile = cbFile.getItemAt(i);
                if (Global.normalProperties.ExtensionsOn) {
                    //если учитываем расширения, ищем полное совпадение
                    if (projectFile.file.getName().equals(file_name)) {
                        cbFile.setSelectedIndex(i);
                        return true;
                    }
                } else {
                    if (Utils_.getNameWithoutExtension(projectFile.file.getName()).equals(
                            Utils_.getNameWithoutExtension(file_name))) {
                        cbFile.setSelectedIndex(i);
                        return true;
                    }
                }
            }
            return (cbFile.getSelectedItem() != null) && (cbFile.getSelectedItem() instanceof ProjectFile);
        }
    }
}
