package Visual_DVM_2021.Passes.All;
import Common.Constants;
import Common.Current;
import Common.Database.Database;
import Common.Global;
import GlobalData.Compiler.CompilerType;
import GlobalData.Machine.MachineType;
import GlobalData.User.UserState;
import TestingSystem.DVM.DVMPackage.DVMPackage;
import TestingSystem.DVM.DVMPackage.DVMPackage_json;
import TestingSystem.Common.TasksPackageState;
import Visual_DVM_2021.Passes.AddObjectPass;
import Visual_DVM_2021.Passes.PassCode_2021;
public class AddDVMPackage extends AddObjectPass<DVMPackage> {
    public AddDVMPackage() {
        super(DVMPackage.class);
    }
    @Override
    protected Database getDb() {
        return Global.testingServer.db;
    }
    @Override
    protected boolean canStart(Object... args) throws Exception {
        if (!Current.getAccount().CheckRegistered(Log)) {
            return false;
        }
        if (Current.Check(Log, Current.Machine, Current.User, Current.Compiler)) {
            if (!Current.getMachine().type.equals(MachineType.Server)) {
                Log.Writeln_("Тестирование поддерживается только на одиночном удалённом сервере.");
                return false;
            }
            if (!Current.getUser().state.equals(UserState.ready_to_work)) {
                Log.Writeln_("Пользователь не готов к работе. Выполните инициализацию пользователя!");
                return false;
            }
            if (!Current.getCompiler().type.equals(CompilerType.dvm)) {
                Log.Writeln_("Тестирование поддерживается только для DVM компиляторов.");
                return false;
            }
            if (!Current.getCompiler().versionLoaded)
                passes.get(PassCode_2021.ShowCompilerVersion).Do(Current.getCompiler(), false);
            //-
            for (DVMPackage dvmPackage: Global.testingServer.db.dvmPackages.Data.values()){
                if (dvmPackage.state.equals(TasksPackageState.Draft)){
                    Log.Writeln_("Может существовать только один пакет, готовящийся к публикации.");
                    return false;
                }
            }
            //--
            target = new DVMPackage();
            target.id = Constants.Nan;
            //-
            target.sender_name=Current.getAccount().name;
            target.sender_address = Current.getAccount().email;
            //-
            target.machine_name = Current.getMachine().name;
            target.machine_address = Current.getMachine().address;
            target.machine_port = Current.getMachine().port;
            //-
            target.user_name = Current.getUser().login;
            target.user_password = Current.getUser().password;
            target.user_workspace = Current.getUser().workspace;
            target.drv = Current.getCompiler().call_command;
            target.version = Current.getCompiler().getVersionInfo();
            target.kernels = Global.properties.TestingKernels;
            target.needsEmail = Global.properties.EmailOnTestingProgress ? 1 : 0;
            //--
            target.package_json = new DVMPackage_json();
            return true;
        }
        return false;
    }
    @Override
    protected void body() throws Exception {
        //черновик не вставляется в бд. идет только как элемент списка.
       Global.testingServer.db.dvmPackages.Data.put(target.id, target);
    }
    @Override
    protected void showDone() throws Exception {
        super.showDone();
        Global.testingServer.db.dvmRunTasks.ShowDVMPackage(target);
    }
}
