package _VisualDVM.Passes.All;
import Common.Passes.Pass;
import Common.Visual.Windows.Dialog.Dialog;
import _VisualDVM.Global;
import _VisualDVM.GlobalData.Compiler.Compiler;
import _VisualDVM.GlobalData.Compiler.CompilerType;
import _VisualDVM.GlobalData.CompilerEnvironment.CompilerEnvironment;
import _VisualDVM.GlobalData.CompilerEnvironment.Json.EnvironmentJson;
import _VisualDVM.GlobalData.CompilerEnvironment.Json.EnvironmentsJson;
import _VisualDVM.GlobalData.CompilerEnvironment.UI.CompilerEnvironmentsFields;
import _VisualDVM.Passes.PassCode;

import javax.swing.*;
public class PickCompilerEnvironmentsForTesting extends Pass<EnvironmentsJson> {
    Compiler compiler = null;
    //-
    @Override
    protected boolean canStart(Object... args) throws Exception {
        target = new EnvironmentsJson();
        if (args[0] == null) {
            Log.Writeln_("Отсутствует текущий компилятор. Выбор флагов недоступен.");
            return false;
        }
        compiler = (Compiler) args[0];
        if (!compiler.type.equals(CompilerType.dvm)) {
            Log.Writeln_("Выбор переменных окружения возможен только для DVM компилятора,");
            return false;
        }
        if (!(compiler.helpLoaded || Global.mainModule.getPass(PassCode.ShowCompilerHelp).Do(compiler, false)))
            return false;
        compiler.environments.Reset();
        if (args.length > 1) {
            target = (EnvironmentsJson) args[1];
            compiler.environments.Synchronize(target);
        }
        Dialog<String, CompilerEnvironmentsFields> dialog =
                new Dialog<String, CompilerEnvironmentsFields>(CompilerEnvironmentsFields.class) {
                    @Override
                    public void InitFields() {
                        compiler.environments.mountUI((JPanel) fields.getContent());
                        compiler.environments.ShowUI();
                    }
                    @Override
                    public boolean NeedsScroll() {
                        return false;
                    }
                    @Override
                    public void validateFields() {
                        for (CompilerEnvironment compilerEnv : compiler.environments.Data.values()) {
                            if (compilerEnv.isSelected() && compilerEnv.value.isEmpty())
                                Log.Writeln_("Отмеченная переменная " + compilerEnv.name + " предполагает непустое значение.");
                        }
                    }
                };
        return dialog.ShowDialog("");
    }
    @Override
    protected void body() throws Exception {
        target.values.clear();
        for (CompilerEnvironment compilerEnv : compiler.environments.Data.values()) {
            if (compilerEnv.isSelected()) {
                target.values.add(new EnvironmentJson(compilerEnv));
            }
        }
    }
}
