package dev.aura.bungeechat.api.utils;

import java.util.HashMap;
import java.util.Map;
import java.util.regex.Pattern;
import lombok.AccessLevel;
import lombok.Getter;

@Getter
public class RegexReplacer {
  private final String patternStr;
  private final Pattern pattern;
  private final String replacement;

  @Getter(AccessLevel.NONE)
  private final int defaultFlags;

  @Getter(AccessLevel.NONE)
  private final Map<Integer, Pattern> patternCache;

  public RegexReplacer(Pattern pattern, String replacement) {
    patternStr = pattern.pattern();
    this.pattern = pattern;
    this.replacement = replacement;

    defaultFlags = pattern.flags();
    patternCache = new HashMap<>();

    patternCache.put(defaultFlags, pattern);
  }

  public RegexReplacer(String pattern, String replacement) {
    this(pattern, 0, replacement);
  }

  public RegexReplacer(String pattern, int regexFlags, String replacement) {
    this(Pattern.compile(pattern, regexFlags), replacement);
  }

  public String apply(String input) {
    return replaceAll(pattern, input);
  }

  public String apply(String input, int flags) {
    if (!patternCache.containsKey(flags)) {
      patternCache.put(flags, Pattern.compile(patternStr, flags));
    }

    return replaceAll(patternCache.get(flags), input);
  }

  private String replaceAll(Pattern pattern, String input) {
    return pattern.matcher(input).replaceAll(replacement);
  }
}