package _VisualDVM.Passes.All;
import Common.Passes.Pass;
import Common.Utils.Utils_;
import Common.Visual.UI;
import Common.Visual.Windows.Dialog.VFileChooser;
import _VisualDVM.Constants;
import _VisualDVM.Global;
import _VisualDVM.Passes.PassCode;
import _VisualDVM.Passes.Server.TestingServerPass;
import _VisualDVM.Repository.Server.ServerCode;
import _VisualDVM.TestingSystem.Common.Group.Group;
import _VisualDVM.TestingSystem.Common.Test.Test;
import _VisualDVM.Utils;

import java.io.File;
import java.util.LinkedHashMap;
import java.util.Vector;
public class ReplaceTestsFromFiles extends TestingServerPass<Vector<Test>> {
    VFileChooser fileChooser = new VFileChooser("Выберите файлы для замены тестов");
    //--
    Group group;
    LinkedHashMap<Integer, Test> oldTests;
    Vector<Test> replaceTests;
    Vector<Test> newTests;
    //--
    @Override
    public String getIconPath() {
        return "/icons/Menu/Undo.png";
    }
    //-
    @Override
    protected boolean canStart(Object... args) throws Exception {
        if (!Global.testingServer.db.groups.getUI().canModifyCurrent(Log))
            return false;
        group = Global.testingServer.db.groups.getUI().getCurrent();
        //--->>>
        Utils.ChooserProjectsSearchDirectory(fileChooser);
        Vector<File> files = fileChooser.ShowMultiDialog();
        //----------------ROLE is-----------------------------------------------
        //--
        File dir = fileChooser.getCurrentDirectory();
        Global.mainModule.getPass(PassCode.UpdateProperty).Do("ProjectsSearchDirectory", dir.getAbsolutePath());
        //---------------
        if (dir.getName().equals(Constants.data)) {
            Log.Writeln_(Utils_.Brackets(dir) + "\nявляется служебной папкой визуализатора!");
            return false;
        }
        if (!Utils.validateProjectFile(dir, Log)) {
            Log.Writeln_("Имя папки " + Utils_.Brackets(dir.getName()) + " содержит запрещённые символы "
                    + Utils_.printAllForbiddenCharacters()
                    + ", или кириллицу.");
            return false;
        }
        if (files.isEmpty()) {
            Log.Writeln_("Не выбрано ни одного файла.");
            return false;
        }
        //-----------------------------------------
        LinkedHashMap<String, File> filesByNames = new LinkedHashMap<>(); //выделенные файлы, сортированные по именам.
        //--
        for (File file : files) {
            String name = Utils_.getNameWithoutExtension(file.getName()).toLowerCase();
            if (!filesByNames.containsKey(name)) {
                filesByNames.put(name, file);
            }
        }
        //--
        oldTests = new LinkedHashMap<>();
        Vector<String> testForReplaceNames = new Vector<>();
        Vector<String> newTestsNames = new Vector<>();
        //--
        for (String name : filesByNames.keySet()) {
            boolean exists = false;
            for (Test test : getServer().db.tests.Data.values()) {
                if ((test.group_id == group.id) && test.description.equals(name)) {
                    exists = true;
                    //--
                    oldTests.put(test.id, test);
                    testForReplaceNames.add(name);
                    break;
                }
            }
            if (!exists)
                newTestsNames.add(name);
        }
        //--
        if (oldTests.size() == 0) {
            Log.Writeln_("Не найдено тестов на замену.");
            return false;
        }
        //--
        if (UI.Question(
                testForReplaceNames.size() + " тестов будет заменено,\n" +
                        newTestsNames.size() + " тестов будет добавлено.\n" +
                        "Продолжить"
        )) {
            replaceTests = new Vector<>();
            Pass createTestPass = Global.mainModule.getPass(PassCode.CreateTestFromFile);
            for (Test old_test : oldTests.values()) {
                File file = filesByNames.get(old_test.description);
                if (createTestPass.Do(file, group)) {
                    Test new_test = (Test) createTestPass.target;
                    replaceTests.add(new_test);
                    new_test.id = old_test.id;
                }
            }
            //--
            newTests = new Vector<>();
            for (String name : newTestsNames) {
                File file = filesByNames.get(name);
                if (createTestPass.Do(file, group)) {
                    Test new_test = (Test) createTestPass.target;
                    newTests.add(new_test);
                }
            }
            if (!replaceTests.isEmpty())
                SendRequest(ServerCode.ReplaceTestsCodes, null, replaceTests);
            if (!newTests.isEmpty())
                SendRequest(ServerCode.PublishObjects, null, newTests);
            return true;
        }
        return false;
    }
    //-
    @Override
    protected void performFinish() throws Exception {
        super.performFinish();
        Global.mainModule.getPass(PassCode.SynchronizeTests).Do();
    }
}
