package Visual_DVM_2021.UI.Main;
import Common.Current;
import Common.UI.DataSetControlForm;
import Common.UI.Label.ShortLabel;
import Common.UI.Menus_2023.VisualiserMenuBar;
import Common.UI.UI;
import Common.Utils.TextLog;
import SapforTestingSystem.SapforTasksPackage.SapforTasksPackage;
import SapforTestingSystem.SapforTasksPackage.SapforTasksPackageInterface;
import SapforTestingSystem.SapforTasksPackage.SapforTasksPackageTree;
import Visual_DVM_2021.Passes.PassCode_2021;
import Visual_DVM_2021.Passes.Pass_2021;

import javax.swing.*;
public class SapforPackagesComparisonForm {
    //-->>
    private JPanel content;
    public JPanel getContent() {
        return content;
    }
    protected JToolBar tools;
    protected JLabel lObjectName;
    private JButton bApplyObject;
    private JButton bPrevious;
    private JButton bNext;
    private JButton bCompare;
    private JButton bClose;
    private JPanel treePanel;
    //-->>
    SapforPackagesComparisonForm this_ = null; //?
    SapforPackagesComparisonForm slave = null;
    SapforPackagesComparisonForm master = null;
    //-->>
    protected SapforTasksPackage object = null;
    //-->>
    //  protected DataSet<String, SapforTaskResult> packageTasks;
    protected DataSetControlForm Body;
    //--->>
    public boolean isMaster() {
        return slave != null;
    }
    public boolean isSlave() {
        return master != null;
    }
    //--->>
    //неперегружаемые методы
    protected void RemoveObject() {
        object = null;
        showNoObject();
    }
    public void ApplyObject() {
        RemoveObject();
        TextLog log = new TextLog();
        if (Current.Check(log, Current.SapforTasksPackage)) {
            object = Current.getSapforTasksPackage();
            if (SapforTasksPackageInterface.isLoaded(object)||(Pass_2021.passes.get(PassCode_2021.DownloadSapforTasksPackage).Do(object)))
            showObject();
            else UI.Info("Пакет не закружен");
        } else
            UI.Info(log.toString());
    }
    //предполагаем что оба объекта есть и мы можем получить с них текст.
    protected void Compare() throws Exception {
        /*
        //это всегда форма мастер
        //1. Получить файл теста.Для сапфора ограничение что файл может быть только один.Возможно и для других тоже.
        //  File project_db = new File(object.Home, "project.json");
        for (String masterTaskKey : packageTasks.Data.keySet()) {
            for (String slaveTaskKey : slave.packageTasks.Data.keySet()) {
                if (masterTaskKey.equals(slaveTaskKey)) {
                    compareTasks(packageTasks.get(masterTaskKey), slave.packageTasks.get(masterTaskKey));
                }
            }
        }
         */
    }
    public void Show() throws Exception {
    }
    protected void showNoObject() {
        lObjectName.setText("?");
        lObjectName.setToolTipText("Объект не назначен.");
        UI.Clear(treePanel);
    }
    protected void showObject() {
        lObjectName.setText(object.getPK().toString() + (isMaster() ? "(эталон)" : ""));
        lObjectName.setToolTipText(object.getPK().toString());
        treePanel.add(new JScrollPane(new SapforTasksPackageTree(SapforTasksPackageInterface.getTreeRoot(object),
        isMaster()? Current.SapforEtalonVersion: Current.SapforVersion
        )));
    }
    protected String getText() {
        return "";
    }
    public SapforPackagesComparisonForm(SapforPackagesComparisonForm slave_in) {
        //-
        this_ = this;
        slave = slave_in;
        bPrevious.setVisible(isMaster());
        bNext.setVisible(isMaster());
        bApplyObject.addActionListener(e -> {
            ApplyObject();
        });
        //--->>>
        if (isMaster()) {
            slave.master = this;
            bPrevious.addActionListener(e -> {
            });
            bNext.addActionListener(e -> {
            });
            bCompare.addActionListener(e -> {
                DoComparePass(isReady() && slave.isReady());
            });
        } else {
            //рабу сравнивать не положено.
            bCompare.setVisible(false);
        }
        //--->>>
        bClose.addActionListener(e -> {
            onClose();
        });
    }
    //-->>
    private void createUIComponents() {
        // TODO: place custom component creation code here
        lObjectName = new ShortLabel(40);
        tools = new VisualiserMenuBar();
    }
    //для сравнения по кнопке.
    public boolean isReady() {
        return false; // object != null;
    }
    public void onClose() {
        RemoveObject();
    }
    public void DoComparePass(boolean startCondition) {
        Pass_2021 pass = new Pass_2021() {
            @Override
            public String getDescription() {
                return "Сравнение";
            }
            @Override
            protected boolean needsAnimation() {
                return true;
            }
            @Override
            public boolean needsConfirmations() {
                return false;
            }
            @Override
            protected boolean canStart(Object... args) throws Exception {
                return startCondition;
            }
            @Override
            protected void body() throws Exception {
                Compare();
            }
        };
        pass.Do();
    }
    public void DoShowPass(boolean startCondition) {
        Pass_2021 pass = new Pass_2021() {
            @Override
            public String getDescription() {
                return "Отображение";
            }
            @Override
            protected boolean needsAnimation() {
                return false;
            }
            @Override
            public boolean needsConfirmations() {
                return false;
            }
            @Override
            protected boolean canStart(Object... args) throws Exception {
                return startCondition;
            }
            @Override
            protected void body() throws Exception {
                Show();
            }
        };
        pass.Do();
    }
}
