package _VisualDVM.GlobalData.Module.UI;
import Common.CommonConstants;
import Common.MainModule_;
import Common.Visual.UI;
import Common.Visual.Windows.Dialog.DBObjectDialog;
import _VisualDVM.GlobalData.Compiler.Compiler;
import _VisualDVM.GlobalData.Compiler.CompilerType;
import _VisualDVM.GlobalData.Machine.Machine;
import _VisualDVM.GlobalData.Makefile.Makefile;
import _VisualDVM.GlobalData.Module.Module;
import _VisualDVM.GlobalData.Module.ModuleAnchestor;
import _VisualDVM.ProjectData.LanguageName;
public class ModuleAnchestorForm<T extends ModuleAnchestor> extends DBObjectDialog<T, ModuleAnchestorFields> {
    public static String[] banned_flags = new String[]{
            "-c", "-o",
            "-ffree-form", "-ffixed-line-length-132", "-ffixed-form",
            "-FI", "-f90",
            "-fixed", "-free"
    };
    String command;
    String flags;
    public ModuleAnchestorForm() {
        super(ModuleAnchestorFields.class);
    }
    @Override
    public int getDefaultHeight() {
        return 250;
    }
    @Override
    public void validateFields() {
        Compiler compiler = (Compiler) fields.cbCompilers.getSelectedItem();
        command = (String) fields.cbCommands.getSelectedItem();
        if (command == null) {
            Log.Writeln("команда компиляции не выбрана");
        } else {
            if ((compiler != null) && compiler.type.equals(CompilerType.dvm)) {
                //проверим команду.
                if (Result instanceof Makefile) {
                    //могут быть только flink/clink
                    if (!command.equals("flink") && !command.equals("clink")
                            &&
                            !command.equals("f") && !command.equals("c")
                    ) {
                        Log.Writeln("При линковке DVM системой допустимы\n" +
                                "только команды f,с, flink или clink");
                    }
                } else if (Result instanceof Module) {
                    //могут быть только f/c
                    LanguageName languageName = ((Module) Result).language;
                    switch (languageName) {
                        case fortran:
                        case c:
                            if (!command.equals(languageName.getDVMCompile()))
                                Log.Writeln("компиляция " + languageName.getDescription() +
                                        " программ DVM системой осуществляется только командой " +
                                        languageName.getDVMCompile()
                                );
                            break;
                        default:
                            Log.Writeln("язык " + languageName + " не поддерживается DVM системой");
                            break;
                    }
                }
            } else {
                if (!command.isEmpty())
                    Log.Writeln("Для всех компиляторов, кроме DVM системы, команда компиляции/линковки должна быть пуста.");
            }
        }
        flags = (String) fields.cbFlags.getSelectedItem();
        if (flags == null) Log.Writeln("флаги компиляции не выбраны");
        else {
            //проверка на служебные флаги
            String[] data = flags.split(" ");
            for (String flag : data) {
                if (!flag.isEmpty()) {
                    /*
                    if (!flag.startsWith("-")) {
                        Log.Writeln("неверный формат флага " + Utils.Brackets(flag));
                    } else {
                     */
                    for (String banned_flag : banned_flags) {
                        if (flag.equalsIgnoreCase(banned_flag)) {
                            Log.Writeln("флаги:\n" +
                                    String.join(",", banned_flags) +
                                    "\nзарезервированы системой.");
                            return;
                        }
                        // }
                    }
                }
            }
        }
        //проврка команды
    }
    @Override
    public void fillFields() {
        UI.TrySelect(fields.cbFlags, Result.flags);
        UI.TrySelect(fields.cbCommands, Result.command);
        UI.TrySelect(fields.cbCompilers, Result.getCompiler());
        //--------------------------------------------
        fields.setListeners(Result);
    }
    @Override
    public void ProcessResult() {
        Result.machine_id = MainModule_.instance.getDb().getTable(Machine.class).getUI().getCurrent().id;
        Compiler compiler = (Compiler) fields.cbCompilers.getSelectedItem();
        Result.compiler_id = (compiler != null) ? compiler.id : CommonConstants.Nan;
        Result.command = command;
        Result.flags = flags;
    }
}
