package _VisualDVM.Visual.Windows;
import Common.Utils.Utils_;
import Common.Visual.UI_;
import _VisualDVM.Current;
import _VisualDVM.GlobalData.GlobalDatabase;
import _VisualDVM.Global;
import _VisualDVM.Visual.Menus.MainMenuBar.MainWindow;
import _VisualDVM.Visual.UI;
import Common.Visual.Windows.Form;
import _VisualDVM.TestingSystem.Common.Group.Group;
import _VisualDVM.TestingSystem.Common.Test.Test;
import Visual_DVM_2021.Passes.PassCode;
import Common.Passes.Pass;
import _VisualDVM.Visual.Interface.*;

import javax.swing.*;
import java.awt.*;
import java.util.Vector;
public class MainForm extends Form implements MainWindow {
    private final WelcomeForm welcomeForm = new WelcomeForm(); //заглушка когда проекта нет.
    int global_index = 0;
    //-----------------
    private ProjectForm projectForm;
    private CallbackForm callbackForm;
    private TestsForm testsForm;
    //---
    private TestingForm testingForm;
    //-----------------
    private JPanel Content;
    private JTabbedPane globalTabs;
    private JPanel mainPanel;
    @Override
    protected JPanel getMainPanel() {
        return Content;
    }
    @Override
    protected String getFormKey() {
        return "Main"; //можно было бы через имя класса
    }
    @Override
    public String getIconPath() {
        return "/icons/Sapfor.png";
    }
    @Override
    public String getWTitleText() {
        return "Visual Sapfor 3.0";
    }
    @Override
    public String getUTitleText() {
        return "Visual Sapfor 3.0";
    }
    @Override
    public void AfterClose() {
        Global.mainModule.getPass(PassCode.CloseCurrentProject).Do();
        if (UI.getVersionsWindow() != null)
            ((VersionsForm) UI.getVersionsWindow()).SaveSplitters();
        SaveCallbackPanel();
        SaveTestsPanel();
        SaveTestingPanel();
        //--
        if (UI.getDebugWindow() != null)
            ((FormWithSplitters) UI.getDebugWindow()).SaveSplitters();
        //--
        Global.mainModule.getDb().SaveCredentials();
        //--
        Global.FinishApplication();
    }
    public MainForm() {
        mainPanel.add(UI.mainMenuBar, BorderLayout.NORTH);
        InstallWelcomePanel();
        InstallCallbackPanel();
        InstallTestsPanel();
        InstallTestingPanel();
        ShowUpdatesIcon();
        //----------------------
    }
    private void InstallWelcomePanel() {
        globalTabs.insertTab("Начало работы",
                null,
                welcomeForm.content,
                "Для начала работы откройте проект с помощью верхней панели инструментов, или перетащите его сюда", 0
        );
    }
    private void InstallProjectPanel() {
        globalTabs.insertTab("", null,
                (projectForm = new ProjectForm()).content,Global.mainModule.getProject().description, 0);
        globalTabs.setTabComponentAt(0,
                new TabToolBar("Проект: " + Global.mainModule.getProject().name, PassCode.CloseCurrentProject) {
                    @Override
                    public void leftMouseAction() {
                        globalTabs.setSelectedIndex(0);
                    }
                });
    }
    private void RemoveProjectPanel() {
        globalTabs.removeTabAt(0);
        if (projectForm != null) {
            projectForm.SaveSplitters();
            projectForm = null;
        }
    }
    private void InstallCallbackPanel() {
        globalTabs.insertTab("Обратная связь",
                Utils_.getIcon("/icons/Bug.png"),
                (callbackForm = new CallbackForm()).getContent(),
                "Журнал ошибок и связь с разработчиками", 1);
    }
    private void SaveCallbackPanel() {
        if (callbackForm != null) {
            callbackForm.SaveSplitters();
            callbackForm = null;
        }
    }
    private void InstallTestsPanel() {
        globalTabs.insertTab("Тесты",
                Utils_.getIcon("/icons/Library.PNG"),
                (testsForm = new TestsForm()).getContent(),
                "Библиотека тестов на сервере", 2);
    }
    private void SaveTestsPanel() {
        if (testsForm != null) {
            testsForm.SaveSplitters();
            testsForm = null;
        }
    }
    private void InstallTestingPanel() {
        testingForm = new TestingForm();
        globalTabs.insertTab("Тестирование",
                Utils_.getIcon("/icons/Session.png"),
                testingForm.getContent(),
                "Система тестирования", 3);
    }
  /*
    public void ShowCurrentCompiler() {
        String res = "";
        if (Current.HasMachine()) {
            res += "@" + Current.getMachine().getURL();
            if (Current.HasUser()) {
                res = Current.getUser().login + res;
            } else res = "?" + res;

            if (Current.HasCompiler() && Current.getCompiler().type.equals(CompilerType.dvm)) {
                res += "DVM система: " + Current.getCompiler().description;
            } else {
                res += "DVM система: ?";
            }
        } else {
            res += "?@?";
        }
        globalTabs.setTitleAt(2, res);
    }
    */
    @Override
    public void ShowCheckedTestsCount() {
        int res = 0;
        for (Group group : Global.testingServer.db.groups.getCheckedItems()) {
            Vector<Test> selected_tests = new Vector<>();
            Vector<Test> group_tests = new Vector<>();
            for (Test test : Global.testingServer.db.tests.Data.values()) {
                if (test.group_id == group.id) {
                    if (test.isSelected())
                        selected_tests.add(test);
                    else
                        group_tests.add(test);
                }
            }
            //-
            if (selected_tests.isEmpty())
                res += group_tests.size();
            else
                res += selected_tests.size();
        }
        //--
        globalTabs.setTitleAt(2, "Тесты: " + res);
    }
    private void SaveTestingPanel() {
        if (testingForm != null) {
            testingForm.SaveSplitters();
            testingForm = null;
        }
    }
    private void saveGlobalTab() {
        global_index = globalTabs.getSelectedIndex();
    }
    private void restoreGlobalTab() {
        globalTabs.setSelectedIndex(global_index);
    }
    @Override
    public ProjectWindow getProjectWindow() {
        return projectForm;
    }
    @Override
    public CallbackWindow getCallbackWindow() {
        return callbackForm;
    }
    @Override
    public TestsWindow getTestsWindow() {
        return testsForm;
    }
    @Override
    public void ShowUpdatesIcon() {
        UI.mainMenuBar.ShowUpdatesIcon();
    }
    @Override
    public void FocusProject() {
        globalTabs.setSelectedIndex(0);
    }
    @Override
    public void FocusCallback() {
        globalTabs.setSelectedIndex(1);
    }
    @Override
    public void FocusTests() {
        globalTabs.setSelectedIndex(2);
    }
    @Override
    public void FocusTesting() {
        globalTabs.setSelectedIndex(3);
    }
    @Override
    public void SwitchTestingTabs(boolean flag) {
        globalTabs.setEnabledAt(2, flag);
        globalTabs.setEnabledAt(3, flag);
       // globalTabs.setEnabledAt(4, flag);
    }
    @Override
    public TestingWindow getTestingWindow() {
        return testingForm;
    }
    @Override
    public void Show() {
        //приходится идти на это только ПОСЛЕ создания главного окна.
        // иначе ссылка на главное окно в методах пустая.
        getCallbackWindow().ShowAll();
        getTestsWindow().ShowAll();
        if (getTestingWindow() != null)
            getTestingWindow().ShowAll();
        UI_.windowsStack.push(this);
        super.Show();
    }
    @Override
    public void ShowProject() {
        //-
        saveGlobalTab();
        RemoveProjectPanel();
        InstallProjectPanel();
        restoreGlobalTab();
        UI.getDebugWindow().DropCompilationTasksComparison();
        UI.mainMenuBar.ShowProject(true);
    }
    @Override
    public void ShowNoProject() {
        //-
        saveGlobalTab();
        RemoveProjectPanel();
        InstallWelcomePanel();
        restoreGlobalTab();
        UI.mainMenuBar.ShowProject(false);
    }
}
