package _VisualDVM.TestingSystem.Common.Test;
import Common.CommonConstants;
import Common.Database.Objects.DBObject;
import Common.Database.Objects.riDBObject;
import Common.Utils.Utils_;
import Common.Visual.UI;
import _VisualDVM.Global;
import _VisualDVM.Passes.All.UnzipFolderPass;
import _VisualDVM.TestingSystem.Common.TestFile.TestFile;
import com.sun.org.glassfish.gmbal.Description;
import org.apache.commons.io.FileUtils;

import java.io.File;
import java.util.Vector;
public class Test extends riDBObject {
    @Description("DEFAULT 0")
    public int min_dim = 0; //мин размерность теста.
    @Description("DEFAULT 0")
    public int max_dim = 0; //макс размерность теста.
    @Description("DEFAULT ''")
    public String args = ""; //аргументы командной строки. на всякий случай поле зарезервирую. пусть будут.
    @Description("DEFAULT -1")
    public int group_id = CommonConstants.Nan;
    @Description("DEFAULT ''")
    public String extended_description = "";
    //--для отправки при публикации---------------->>>
    @Description("IGNORE")
    public String temp_project_name = "";
    @Description("IGNORE")
    public byte[] project_archive_bytes = null;
    @Description("IGNORE")
    public Vector<TestFile> files = null;
    //--------------------------------------------->>>
    public Test(Test test) {
        this.SynchronizeFields(test);
    }
    public Test() {
    }
    @Override
    public void SynchronizeFields(DBObject src) {
        super.SynchronizeFields(src);
        Test t = (Test) src;
        min_dim = t.min_dim;
        max_dim = t.max_dim;
        args = t.args;
        group_id = t.group_id;
        extended_description = t.extended_description;
    }
    @Override
    public void select(boolean flag) {
        super.select(flag);
        if (UI.isActive())
            Global.mainModule.getUI().getMainWindow().ShowCheckedTestsCount();
    }
    //-
    public File getServerPath() {
        return new File(Global.TestsDirectory, String.valueOf(id));
    }
    public File getHomePath() {
        return new File(Global.visualiser.getDownloadsDirectory(), String.valueOf(id));
    }
    //--
    public File getTempArchive() {
        return new File(Global.TempDirectory, temp_project_name + ".zip");
    }
    public File getTempProject() {
        return new File(Global.TempDirectory, temp_project_name);
    }
    public boolean unpackProjectOnServer() throws Exception {
        File tmpArchive = new File(Global.TempDirectory, temp_project_name + ".zip");
        File tmpProject = new File(Global.TempDirectory, temp_project_name);
        File testProject = new File(Global.TestsDirectory, String.valueOf(id));
        //--
        if (tmpArchive.exists())
            FileUtils.forceDelete(tmpArchive);
        if (tmpProject.exists())
            FileUtils.forceDelete(tmpProject);
        if (testProject.exists())
            FileUtils.forceDelete(testProject);
        //--
        Utils_.bytesToFile(project_archive_bytes, tmpArchive); // распаковка байтов.
        //-- делается через другое имя, потому что на момент публикации теста архив не мог знать ид теста.
        UnzipFolderPass unzipFolderPass = new UnzipFolderPass();
        if (!unzipFolderPass.Do(
                tmpArchive.getAbsolutePath(),
                Global.TempDirectory.getAbsolutePath())) {
            return false;
        }
        //--
        FileUtils.moveDirectory(tmpProject, testProject);
        if (tmpArchive.exists())
            FileUtils.forceDelete(tmpArchive);
        //--
        return true;
    }
    public Vector<File> getServerFiles() {
        File path = getServerPath();
        Vector<File> res = new Vector<>();
        for (TestFile testFile : Global.testingServer.db.getVectorByFK(this, TestFile.class))
            res.add(new File(path, testFile.name));
        return res;
    }
}
