package Visual_DVM_2021.Passes.All;
import Common.Current;
import Common.Database.Database;
import Common.Global;
import Common.UI.UI;
import Common.Utils.Utils;
import GlobalData.Account.AccountRole;
import Repository.BugReport.BugReport;
import Repository.BugReport.BugReportInterface;
import Repository.BugReport.BugReportState;
import Repository.Component.ComponentType;
import Visual_DVM_2021.Passes.AddObjectPass;
import Visual_DVM_2021.Passes.PassCode_2021;

import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.util.Date;
import java.util.Vector;
public class AddBugReport extends AddObjectPass<BugReport> {
    public AddBugReport() {
        super(BugReport.class);
    }
    @Override
    protected Database getDb() {
        return Global.componentsServer.db;
    }
    @Override
    public boolean canStart(Object... args) throws Exception {
        if (Current.getAccount().role.equals(AccountRole.Undefined)) {
            Log.Writeln_("Для создания отчёта требуется регистрация");
            return false;
        }
        if (Current.HasProject()) {
            String version = Current.getProject().Home.getAbsolutePath().substring(Current.getRoot().Home.getParent().length());
            if (version.toCharArray()[0] == '\\') version = version.substring(1);
            target = new BugReport(Current.getAccount().name, Current.getAccount().email,
                    "Черновик отчёта об ошибке.\nЗаполните описание ошибочной ситуации, и нажмите 'Опубликовать'", version);
            return true;
        } else {
            if (UI.Warning("Создать отчёт об ошибке без прикрепления проекта.")) {
                target = new BugReport();
                target.genName();
                target.sender_name = Current.getAccount().name;
                target.sender_address = Current.getAccount().email;
                target.project_version = "";
                target.visualiser_version = Global.visualiser.version;
                target.sapfor_version = Global.Components.get(ComponentType.Sapfor_F).version;
                target.sapfor_settings = Global.db.settings.getSapforSettingsText();
                target.percentage = 0;
                target.description = "Черновик отчёта об ошибке.\nЗаполните описание ошибочной ситуации, и нажмите 'Опубликовать'";
                target.date = new Date().getTime();
                target.change_date = new Date().getTime();
                target.state = BugReportState.draft;
                target.owner = null;
                return true;
            }
        }
        return false;
    }
    @Override
    protected void performPreparation() throws Exception {
        Current.getSapfor().ResetAllAnalyses();
    }
    @Override
    protected void body() throws Exception {
        super.body();
        if (!target.project_version.isEmpty()) {
            Current.getRoot().cleanDepAndGCOVR(); //удаление депов и гкова
            //логи во вложения.
            File attachementsDir = Current.getProject().getAttachmentsDirectory();
            Vector<File> logs = new Vector<>();
            logs.add(Global.Log.getLogFile());
            logs.add(Paths.get(Global.ComponentsDirectory.getAbsolutePath(), "Sapfor_log.txt").toFile());
            logs.add(Paths.get(Global.ComponentsDirectory.getAbsolutePath(), "Server_log.txt").toFile());
            logs.add(Global.Components.get(ComponentType.Visualizer_2).getLogFile());
            for (File file : logs) {
                if (file.exists())
                    Files.copy(file.toPath(), Paths.get(attachementsDir.getAbsolutePath(), file.getName()), StandardCopyOption.REPLACE_EXISTING);
            }
            //запаковка рута
            passes.get(PassCode_2021.ZipFolderPass).Do(Current.getRoot().Home.getAbsolutePath(), BugReportInterface.getArchiveFile(target).getAbsolutePath());
        }
    }
    @Override
    protected boolean validate() {
        double size = Utils.getFileSizeMegaBytes(BugReportInterface.getArchiveFile(target));
        if (size > 100) {
            Log.Writeln_("Размер запакованного вложения " + size + " Мб превышает 100 Мб");
            return false;
        }
        return super.validate();
    }
}
