package _VisualDVM.GlobalData.Tasks.Supervisor.Local.Linux;
import Common.Utils.Utils_;
import _VisualDVM.GlobalData.Makefile.Makefile;
import _VisualDVM.GlobalData.Tasks.CompilationTask.CompilationTask;
import _VisualDVM.GlobalData.Tasks.TaskState;
import org.apache.commons.io.FileUtils;

import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
public class LinuxLocalCompilationSupervisor extends LinuxLocalTaskSupervisor<CompilationTask> {
    @Override
    protected void PrepareWorkspace() throws Exception {
        //возможно тут сделать отличие. не удалять все, а тоже сверять по дате и именам..
        super.PrepareWorkspace();
        Utils_.CheckAndCleanDirectory(getProjectCopy());
        //скопировать проект в папку. без бд.
        project.Clone(getProjectCopy(), false);
        //-удалить старый бинарник если есть? бессмысленно если папка и так полностью пересоздается при каждой компиляции.
        //по идее надо исправить на синхронизацию.
        //if (!task.binary_name.isEmpty()) {
        //    File old_binary = Paths.get(getProjectCopy().getAbsolutePath(), task.binary_name).toFile();
        //    FileUtils.forceDelete(old_binary);
        // }
        //создать мейкфайл.
        Makefile makefile = task.getMakefile();
        File makefile_text = Paths.get(getProjectCopy().getAbsolutePath(), "Makefile").toFile();
        FileUtils.write(makefile_text, makefile.Generate(project));
    }
    @Override
    protected void ValidateTaskResults() throws Exception {
        if (getBinary().exists()) {
            File renamed_binary = Paths.get(getProjectCopy().getAbsolutePath(),
                    Utils_.getDateName("spf")).toFile();
            task.binary_name = renamed_binary.getName();
            Files.move(getBinary().toPath(), renamed_binary.toPath(), StandardCopyOption.REPLACE_EXISTING);
            task.state = TaskState.Done;
        } else task.state = TaskState.DoneWithErrors;
        task.AnalyzeResultsTexts(project);
    }
}
