package _VisualDVM.Passes.Sapfor;
import Common.Visual.Controls.PassMenuItem;
import _VisualDVM.ComponentsServer.Component.Sapfor.Sapfor;
import _VisualDVM.ComponentsServer.Component.Sapfor.TransformationPermission;
import _VisualDVM.Current;
import _VisualDVM.Global;
import _VisualDVM.Passes.PassCode;
import _VisualDVM.ProjectData.Project.db_project_info;
import _VisualDVM.ProjectData.ProjectView;

import javax.swing.*;
public class SapforTransformation extends SapforPass {
    protected String Options = ""; //дополнительный аргумент для преобразований.
    protected TransformationPermission getPermission() {
        return TransformationPermission.All;
    }
    @Override
    public String getIconPath() {
        return "/icons/Transformations/" + getName() + ".png";
    }
    protected String getVersionLetter() {
        return "v";
    }
    protected String getVersionDescription() {
        return getDescription();
    }
    //-
    @Override
    protected PassCode necessary() {
        return PassCode.SPF_ParseFilesWithOrder;
    }
    protected boolean resetAnalysesAfter() {
        return true;
    }
    @Override
    protected boolean isGoodCode() {
        return sapfor.getErrorCode() >= 0;
    }
    @Override
    protected void performPreparation() throws Exception {
        super.performPreparation();
        db_project_info.ResetNewVersions();
        target.createEmptyVersion(getVersionLetter(), getVersionDescription());
        //уже добавлена. отображена и выбрана!
    }
    @Override
    protected void body() throws Exception {
        sapfor.RunTransformation(
                getName(),
                -Global.messagesServer.getPort(),
                target.sapforProperties.pack(),
                target.getProjFile().getAbsolutePath(),
                target.last_version.Home.getAbsolutePath(),
                Options
        );
    }
    @Override
    protected void performDone() throws Exception {
        //миграция типов файлов.
        target.migrateFilesSettings(target.last_version, true, true);
        if (resetAnalysesAfter())
            sapfor.ResetAllAnalyses();
    }
    @Override
    public boolean hasStats() {
        return true;
    }
    @Override
    protected void FocusResult() {
        Global.mainModule.getUI().getMainWindow().getProjectWindow().FocusVersions();
    }
    @Override
    protected void performFail() throws Exception {
        super.performFail();
        target.undoLastTransformation();
    }
    @Override
    protected void showFinish() throws Exception {
        super.showFinish();
        Global.mainModule.set(Current.ProjectView, ProjectView.Files);
        Global.mainModule.getUI().getMainWindow().getProjectWindow().ShowProjectView();
    }
    @Override
    protected boolean canStart(Object... args) throws Exception {
        switch (Sapfor.transformationPermission) {
            case All:
                return super.canStart(args);
            case VariantsOnly:
                if (getPermission().equals(TransformationPermission.VariantsOnly)) {
                    return super.canStart(args);
                } else {
                    Log.Writeln_("Разрешено только построение параллельных вариантов!");
                    return false;
                }
            case None:
                Log.Writeln_("Нет разрешения на выполнение преобразований");
                return false;
        }
        return false;
    }
    @Override
    public JMenuItem createMenuItem() {
        if (menuItem == null)
            menuItem = new PassMenuItem(this);
        return menuItem;
    }
}
