package _VisualDVM.Passes.All;
import Common.MainModule_;
import Common.Visual.UI;
import _VisualDVM.Global;
import _VisualDVM.GlobalData.Compiler.Compiler;
import _VisualDVM.GlobalData.Compiler.CompilerType;
import _VisualDVM.GlobalData.Machine.Machine;
import _VisualDVM.GlobalData.Machine.MachineType;
import _VisualDVM.GlobalData.User.User;
import _VisualDVM.GlobalData.User.UserState;
import _VisualDVM.Passes.PassCode;
import _VisualDVM.Passes.Server.PublishServerObject;
import _VisualDVM.Repository.Server.SafeServerExchangeUnit;
import _VisualDVM.Repository.Server.ServerCode;
import _VisualDVM.TestingSystem.Common.TestingServer;
import _VisualDVM.TestingSystem.DVM.DVMConfiguration.DVMConfiguration;
import _VisualDVM.TestingSystem.DVM.DVMPackage.DVMPackage;

import java.util.Vector;
public class StartSelectedDVMConfigurations extends PublishServerObject<TestingServer, DVMPackage> {
    //--
    Machine machine;
    User user;
    Compiler compiler;
    public StartSelectedDVMConfigurations() {
        super(Global.testingServer, DVMPackage.class);
    }
    @Override
    public String getIconPath() {
        return "/Common/icons/BlueStart.png";
    }
    //--
    @Override
    protected boolean canStart(Object... args) throws Exception {
        //--
        machine = null;
        user = null;
        compiler = null;
        //--
        if (!Global.mainModule.getAccount().CheckRegistered(Log)) {
            return false;
        }
        if (!MainModule_.instance.getDb().CheckCurrent(Log, Machine.class, User.class, Compiler.class))
            return false;
        //--
        machine = MainModule_.instance.getDb().getTable(Machine.class).getUI().getCurrent();
        user = MainModule_.instance.getDb().getTable(User.class).getUI().getCurrent();
        compiler = MainModule_.instance.getDb().getTable(Compiler.class).getUI().getCurrent();
        //--
        if (!machine.type.equals(MachineType.Server)) {
            Log.Writeln_("Тестирование поддерживается только на одиночном удалённом сервере.");
            return false;
        }
        if (!user.state.equals(UserState.ready_to_work)) {
            Log.Writeln_("Пользователь не готов к работе. Выполните инициализацию пользователя!");
            return false;
        }
        if (!compiler.type.equals(CompilerType.dvm)) {
            Log.Writeln_("Тестирование поддерживается только для DVM компиляторов.");
            return false;
        }
        if (!compiler.versionLoaded)
            Global.mainModule.getPass(PassCode.ShowCompilerVersion).Do(compiler, false);
        //-----
        if (!Global.testingServer.db.dvmConfigurations.getUI().CheckSelectedOrCurrent(Log)) {
            return false;
        }
        Vector<DVMConfiguration> configurations = Global.testingServer.db.dvmConfigurations.getUI().getSelectedOrCurrent();
        // for (DVMConfiguration configuration:configurations){
        //     Global.testingServer.db.actualizeConfigurationGroups(configuration);
        // }
        //---
        //проверить конфигурации на соответствие группам.
        //если конфигурации количество тестов 0, но есть группы.проверить на пустоту этих групп,и заполнить заново всеми их тестами.
        //---
        target = new DVMPackage(
                Global.mainModule.getAccount(),
                machine,
                user,
                compiler,
                configurations,
                Global.normalProperties.EmailOnTestingProgress ? 1 : 0,
                Global.normalProperties.ErasePackageWorkspace ? 1 : 0
        );
        //----
        if (target.tasksCount == 0) {
            Log.Writeln_("Задач не найдено.");
            return false;
        }
        return UI.Question("Будет запущено " + target.tasksCount + " задач. Продолжить");
    }
    @Override
    protected void showPreparation() throws Exception {
        getDb().getTable(DVMConfiguration.class).ShowUI();
    }
    @Override
    protected void ServerAction() throws Exception {
        Command(new SafeServerExchangeUnit(ServerCode.PublishObject, user.password, target));
        pk = server_response.object;
    }
}
