package _VisualDVM.Validators;
import Common.Utils.TextLog;
import Common.Utils.Utils_;
import org.fife.ui.rsyntaxtextarea.RSyntaxUtilities;
public class PathValidator extends Validator {
    PathValidatorState state;
    StringBuilder name;
    int spaces_count;
    public PathValidator(String string, String string_name_in, TextLog log_in) {
        super(string, string_name_in, log_in);
    }
    @Override
    protected void reset() {
        state = PathValidatorState.Start;
        name = new StringBuilder();
        spaces_count = 0;
    }
    @Override
    protected boolean continueCondition() {
        return (state == PathValidatorState.Name) || state == PathValidatorState.Start;
    }
    @Override
    protected void Body() {
        switch (state) {
            case Start:
                if (RSyntaxUtilities.isLetter(c) || RSyntaxUtilities.isDigit(c) || c == '_') {
                    name.append(c);
                    state = PathValidatorState.Name;
                } else state = PathValidatorState.WrongNameFormat;
                break;
            case Name:
                switch (c) {
                    case '/':
                        reset();
                        break;
                    case ' ':
                        spaces_count++;
                        name.append(c);
                        break;
                    default:
                        if (Utils_.isForbiddenCharacter(c))
                            state = PathValidatorState.Forbidden;
                        else name.append(c);
                        break;
                }
                break;
        }
    }
    @Override
    protected void PerformFinish() {
        switch (state) {
            case WrongNameFormat:
                Log.Writeln(string_name + ": имя файла или каталога в пути имеет неверный формат");
                break;
            case Forbidden:
                Log.Writeln(string_name + ": Составляющие путь имена содержат запрещённые символы \n" + Utils_.printAllForbiddenCharacters());
                break;
            case Name:
                if (spaces_count > 0)
                    Log.Writeln(string_name + ": Пробелы в окончании пути к файлу запрещены.");
                break;
        }
    }
    @Override
    protected int getStartIndex() {
        return 1;
    }
}
