package _VisualDVM.GlobalData.EnvironmentValue;
import Common.Database.Tables.iDBTable;
import Common.Utils.Utils_;
import Common.Visual.DataSetControlForm;
import Common.Visual.UI_;
import Common.Visual.Windows.Dialog.DBObjectDialog;
import _VisualDVM.Current;
import _VisualDVM.Global;
import _VisualDVM.GlobalData.EnvironmentValue.UI.EnvironmentValueFields;
import _VisualDVM.Utils;
public class EnvironmentValuesDBTable extends iDBTable<EnvironmentValue> {
    public EnvironmentValuesDBTable() {
        super(EnvironmentValue.class);
    }
    @Override
    public String getSingleDescription() {
        return "переменная окружения";
    }
    @Override
    public String getPluralDescription() {
        return "переменные окружения";
    }
    @Override
    public DBObjectDialog<EnvironmentValue, EnvironmentValueFields> getDialog() {
        return new DBObjectDialog<EnvironmentValue, EnvironmentValueFields>(EnvironmentValueFields.class) {
            @Override
            public void fillFields() {
                UI_.TrySelect(fields.cbName, Result.name);
                fields.tfValue.setText(Result.value);
            }
            //https://javarush.ru/groups/posts/regulyarnye-vyrazheniya-v-java
            @Override
            public void validateFields() {
                String name = (String) fields.cbName.getSelectedItem();
                String value = fields.tfValue.getText();
                if (name.isEmpty())
                    Log.Writeln("Имя переменной окружения не может быть пустым.");
                if (!name.matches("\\w*")) {
                    Log.Writeln("Имя переменной окружения может содержать только латинские буквы, цифры и подчёркивания");
                }
                if (Utils.isLinuxSystemCommand(name))
                    Log.Writeln(Utils_.DQuotes(name) + " является системной командой Linux,\nи не может быть задано в качестве имени переменной окружения.");
                if (value.contains("\"")) {
                    Log.Writeln("Значение переменной окружения не может содержать двойные кавычки");
                }
                for (EnvironmentValue env : (Global.mainModule.getDb()).environmentValues.Data.values()) {
                    if (env.isVisible() && (Result.id != env.id) && (env.name.equals(name))) {
                        Log.Writeln("В конфигурации запуска уже задана переменная окружения  с именем " + Utils_.Brackets(name));
                        break;
                    }
                }
            }
            @Override
            public void ProcessResult() {
                Result.machine_id = Global.mainModule.getMachine().id;
                Result.run_configuration_id = Global.mainModule.getRunConfiguration().id;
                Result.name = (String) fields.cbName.getSelectedItem();
                Result.value = fields.tfValue.getText();
            }
            @Override
            public int getDefaultHeight() {
                return 200;
            }
        };
    }
    @Override
    protected DataSetControlForm createUI() {
        return new DataSetControlForm(this) {
            @Override
            protected void AdditionalInitColumns() {
                columns.get(0).setVisible(false);
            }
        };
    }
    @Override
    public String[] getUIColumnNames() {
        return new String[]{"имя", "значение"};
    }
    @Override
    public Object getFieldAt(EnvironmentValue object, int columnIndex) {
        switch (columnIndex) {
            case 1:
                return object.name;
            case 2:
                return object.value;
        }
        return null;
    }
    @Override
    public Current CurrentName() {
        return Current.EnvironmentValue;
    }
    public EnvironmentValue getEnvByName(String name_in) {
        for (EnvironmentValue environmentValue : Data.values())
            if (environmentValue.name.equalsIgnoreCase(name_in)) return environmentValue;
        return null;
    }
    @Override
    public Class getMenuBarClass() {
        return EnvironmentValuesMenuBar.class;
    }
}
