package _VisualDVM.Visual.Windows;
import Common.MainModule_;
import Common.Utils.Utils_;
import Common.Visual.Controls.TabToolBar;
import Common.Visual.FormWithSplitters;
import Common.Visual.Windows.Form;
import _VisualDVM.Global;
import _VisualDVM.Passes.PassCode;
import _VisualDVM.TestingSystem.Common.Group.Group;
import _VisualDVM.TestingSystem.Common.Test.Test;
import _VisualDVM.Visual.Interface.*;
import _VisualDVM.Visual.Menus.MainMenuBar.MainMenuBar;

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 = null;
    private CallbackForm callbackForm = null;
    private CredentialsForm credentialsForm = null; //машины пользователи компиляторы
    //--- формы которые появлятся от прав
    private TestsForm testsForm = null;
    private TestingForm testingForm = null;
    private AdministrationForm administrationForm = null;
    //-----------------
    private JPanel Content;
    private JTabbedPane globalTabs;
    private JPanel mainPanel;
    public MainForm() {
        mainPanel.add(Global.mainModule.getUI().mainMenuBar = new MainMenuBar(), BorderLayout.NORTH);
        InstallWelcomePanel();
        InstallCallbackPanel();
        InstallCredentialsPanel();
        ShowUpdatesIcon();
        //----------------------
    }
    @Override
    protected JPanel getMainPanel() {
        return Content;
    }
    @Override
    public 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 (Global.mainModule.getUI().getVersionsWindow() != null)
            ((FormWithSplitters) Global.mainModule.getUI().getVersionsWindow()).SaveSplitters();
        SaveCallbackPanel();
        SaveCredentialsPanel();
        SaveTestsPanel();
        SaveTestingPanel();
        SaveAdministrationPanel();
        //--
        if (Global.mainModule.getUI().getDebugWindow() != null)
            ((FormWithSplitters) Global.mainModule.getUI().getDebugWindow()).SaveSplitters();
        //--
        Global.mainModule.getDb().SaveCredentials();
        //--
        Global.FinishApplication();
    }
    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 SaveCredentialsPanel() {
        if (credentialsForm != null) {
            credentialsForm.SaveSplitters();
            credentialsForm = null;
        }
    }
    private void InstallCredentialsPanel() {
        globalTabs.insertTab("Машины",
                Utils_.getIcon("/icons/Session.png"),
                (credentialsForm = new CredentialsForm()).getContent(),
                "Машины, пользователи и компиляторы", 2);
    }
    private void SaveTestsPanel() {
        if (testsForm != null) {
            testsForm.SaveSplitters();
            testsForm = null;
        }
    }
    @Override
    public void ShowCheckedTestsCount() {
        int res = 0;
        for (Group group : Global.testingServer.db.groups.getUI().getSelectedItems()) {
            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(3, "Тесты: " + 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 void ShowUpdatesIcon() {
        Global.mainModule.getUI().mainMenuBar.ShowUpdatesIcon();
    }
    @Override
    public void FocusProject() {
        globalTabs.setSelectedIndex(0);
    }
    @Override
    public void FocusCallback() {
        globalTabs.setSelectedIndex(1);
    }
    @Override
    public void FocusCredentials() {
        globalTabs.setSelectedIndex(2);
    }
    @Override
    public void FocusTests() {
        globalTabs.setSelectedIndex(3);
    }
    @Override
    public void FocusTesting() {
        globalTabs.setSelectedIndex(4);
    }
    @Override
    public void Show() {
        //приходится идти на это только ПОСЛЕ создания главного окна.
        // иначе ссылка на главное окно в методах пустая.
        Global.mainModule.getUI().ShowAccount();
        getCallbackWindow().ShowAll();
        getCredentialsWindow().ShowAll();
        //--->>>
        if (testsForm != null)
            getTestsWindow().ShowAll();
        if (testingForm != null)
            getTestingWindow().ShowAll();
        if (Global.mainModule.getAccount().isAdmin())
            getAdministrationWindow().ShowAll();
        MainModule_.instance.getUI().windowsStack.push(this);
        super.Show();
    }
    @Override
    public CredentialsWindow getCredentialsWindow() {
        return credentialsForm;
    }
    @Override
    public void ShowProject() {
        //-
        saveGlobalTab();
        RemoveProjectPanel();
        InstallProjectPanel();
        restoreGlobalTab();
        Global.mainModule.getUI().getDebugWindow().DropCompilationTasksComparison();
        Global.mainModule.getUI().mainMenuBar.ShowProject(true);
    }
    @Override
    public void ShowNoProject() {
        //-
        saveGlobalTab();
        RemoveProjectPanel();
        InstallWelcomePanel();
        restoreGlobalTab();
        Global.mainModule.getUI().mainMenuBar.ShowProject(false);
    }
    private void SaveAdministrationPanel() {
        if (administrationForm != null) {
            administrationForm.SaveSplitters();
            administrationForm = null;
        }
    }
    //--
    @Override
    public TestsWindow getTestsWindow() {
        if (testsForm == null)
            testsForm = new TestsForm();
        return testsForm;
    }
    @Override
    public TestingWindow getTestingWindow() {
        if (testingForm == null)
            testingForm = new TestingForm();
        return testingForm;
    }
    @Override
    public AdministrationWindow getAdministrationWindow() {
        if (administrationForm == null)
            administrationForm = new AdministrationForm();
        return administrationForm;
    }
    @Override
    public void ShowUndefinedTabs() {
        //ничего не делаем. лишних панелей и так нет. экспорт
    }
    @Override
    public void ShowUserTabs() {
    }
    @Override
    public void ShowStudentTabs() {
    }
    @Override
    public void ShowDeveloperTabs() {
        //добавить вкладки тестов и тестирования
        globalTabs.insertTab("Тесты",
                Utils_.getIcon("/Common/icons/Library.png"),
                getTestsWindow().getContent(),
                "Библиотека тестов на сервере", 3);
        globalTabs.insertTab("Тестирование",
                Utils_.getIcon("/icons/Testing.png"),
                getTestingWindow().getContent(),
                "Система тестирования", 4);
    }
    @Override
    public void ShowAdminTabs() {
        //добавить вкладки тестов, тестирования, администрирования
        globalTabs.insertTab("Тесты",
                Utils_.getIcon("/Common/icons/Library.png"),
                getTestsWindow().getContent(),
                "Библиотека тестов на сервере", 3);
        globalTabs.insertTab("Тестирование",
                Utils_.getIcon("/icons/Testing.png"),
                getTestingWindow().getContent(),
                "Система тестирования", 4);
        globalTabs.insertTab("Администрирование",
                Utils_.getIcon("/icons/Subscribe.png"),
                getAdministrationWindow().getContent(),
                "Подписчики", 5);
    }
}
