package Visual_DVM_2021.Passes;
import _VisualDVM.Current;
import _VisualDVM.Global;
import _VisualDVM.Visual.UI;
import _VisualDVM.ProjectData.Files.DBProjectFile;
import _VisualDVM.ProjectData.SapforData.Variants.ParallelVariant;
import _VisualDVM.Repository.Component.Sapfor.Sapfor;
public abstract class VariantsMassPass extends CurrentProjectPass {
    public abstract PassCode getSubPassCode();
    int count;
    @Override
    protected boolean needsAnimation() {
        return true;
    }
    @Override
    public void Interrupt() throws Exception {
        Global.mainModule.getSapfor().Interrupt();
    }
    @Override
    protected boolean canStart(Object... args) throws Exception {
        count =0;
        if (super.canStart(args)) {
            count = target.parallelVariants.getCheckedCount();
            if (count== 0) {
                Log.Writeln_("Не выбрано ни одного параллельного варианта");
                return false;
            } else if (! Global.mainModule.getPass(PassCode.SPF_GetArrayDistribution).isDone()) {
                Log.Writeln_("Варианты неактуальны. Сначала перестройте распределение данных.");
                return false;
            }
            return true;
        }
        return false;
    }
    protected void body() throws Exception {
        ShowProgress(count, 0, true);
        int i = 0;
        for (ParallelVariant p : target.parallelVariants.Data.values())
            if (p.isSelected()) {
                if (! Global.mainModule.getPass(getSubPassCode()).Do(p)) break;
                ShowProgress(count, ++i, true);
            }
    }
    @Override
    protected void performFinish() throws Exception {
        //распаковку соо делаем только 1 раз. после всей массы вариантов.
        Sapfor sapfor = Global.mainModule.getSapfor();
        target.unpackMessagesAndLog(sapfor.getOutputMessage(), sapfor.getOutput());
    }
    @Override
    protected void showFinish() throws Exception {
        UI.getVersionsWindow().getVariantsWindow().RefreshVariants();
        UI.getMainWindow().getProjectWindow().RefreshProjectFiles();
        UI.getMainWindow().getProjectWindow().ShowProjectSapforLog();
        //-
        DBProjectFile badFile = target.getFirstBadFile();
        if (badFile != null) {
            Global.mainModule.getPass(PassCode.OpenCurrentFile).Do(badFile);
            UI.getMainWindow().FocusProject();
            UI.getMainWindow().getProjectWindow().FocusFile();
        }
        //-
        if (Global.mainModule.HasFile())
            Global.mainModule.getFile().form.ShowMessages();
    }
}
