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.Current;
import _VisualDVM.Global;
import _VisualDVM.Passes.All.UnzipFolderPass;
import _VisualDVM.Passes.All.ZipFolderPass;
import _VisualDVM.ProjectData.Files.FileState;
import _VisualDVM.ProjectData.Files.FileType;
import _VisualDVM.ProjectData.Files.ProjectFile;
import _VisualDVM.ProjectData.LanguageName;
import _VisualDVM.Repository.RepositoryRefuseException;
import _VisualDVM.Visual.UI;
import com.sun.org.glassfish.gmbal.Description;
import org.apache.commons.io.FileUtils;

import java.io.File;
import java.util.LinkedHashMap;
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 files = ""; //файлы теста
    //--------------------------------------------->>>
    @Description("IGNORE")
    public String temp_project_name = "";
    @Description("IGNORE")
    public byte[] project_archive_bytes = 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;
    }
    @Override
    public void select(boolean flag) {
        super.select(flag);
        if (UI_.isActive())
            UI.getMainWindow().ShowCheckedTestsCount();
    }
    //---
    @Override
    public boolean isVisible() {
        return Global.mainModule.matchCurrentID(Current.Group, group_id);
    }
    //-
    public File getArchive() {
        return new File(Global.TestsDirectory, id + ".zip");
    }
    //-
    public File getServerPath() {
        return new File(Global.TestsDirectory, String.valueOf(id));
    }
    public File getHomePath() {
        return new File(Global.visualiser.getWorkspace(), 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));
        File testArchive = new File(Global.TestsDirectory, id + ".zip");
        //--
        if (tmpArchive.exists())
            FileUtils.forceDelete(tmpArchive);
        if (tmpProject.exists())
            FileUtils.forceDelete(tmpProject);
        if (testProject.exists())
            FileUtils.forceDelete(testProject);
        if (testArchive.exists())
            FileUtils.forceDelete(testArchive);
        //--
        Utils_.bytesToFile(project_archive_bytes, tmpArchive); // распаковка байтов.
        //--
        UnzipFolderPass unzipFolderPass = new UnzipFolderPass();
        if (!unzipFolderPass.Do(
                tmpArchive.getAbsolutePath(),
                Global.TempDirectory.getAbsolutePath())) {
            return false;
        }
        //--
        FileUtils.moveDirectory(tmpProject, testProject);
        //--
        ZipFolderPass zip = new ZipFolderPass();
        if (!zip.Do(testProject.getAbsolutePath(), testArchive.getAbsolutePath()))
            throw new RepositoryRefuseException("Не удалось переписать архив проекта");
        return true;
    }
    public String getFilesForTable() {
        return files.replace("\n", ";");
    }
    public LinkedHashMap<LanguageName, Vector<ProjectFile>> getPrograms() {
        LinkedHashMap<LanguageName, Vector<ProjectFile>> res = new LinkedHashMap<>();
        //--
        res.put(LanguageName.fortran, new Vector<>());
        res.put(LanguageName.c, new Vector<>());
        res.put(LanguageName.cpp, new Vector<>());
        //--
        String[] files_names = files.split("\n");
        for (String file_name : files_names) {
            ProjectFile file = new ProjectFile(new File(file_name));
            //--
            if (!file.state.equals(FileState.Excluded) &&
                    file.fileType.equals(FileType.program) &&
                    (!file.languageName.equals(LanguageName.n)))
                res.get(file.languageName).add(file);
        }
        return res;
    }
}
