package com.baselet.control;

import java.util.HashSet;
import java.util.Set;

import com.baselet.control.constants.SharedConstants;
import com.baselet.control.enums.FormatLabels;

public class StringStyle {

	public static final String ESCAPE_CHARACTER = "\\";
	private static final String TEMP_REPLACEMENT = "§$§ä%§%ü/,";

	private final Set<FormatLabels> format;
	private final String stringWithoutMarkup;

	public StringStyle(Set<FormatLabels> format, String stringWithoutMarkup) {
		super();
		this.format = format;
		this.stringWithoutMarkup = stringWithoutMarkup;
	}

	public static String replaceNotEscaped(String line) {
		line = StringStyle.replaceNotEscaped(line, SharedConstants.LEFT_QUOTATION, "\u00AB");
		line = StringStyle.replaceNotEscaped(line, SharedConstants.RIGHT_QUOTATION, "\u00BB");
		return line;
	}

	/**
	 * this method does not use "complex" regular expressions to avoid problems with compiling to GWT
	 */
	public static String replaceNotEscaped(String s, String old, String replacement) {
		s = s.replace(ESCAPE_CHARACTER + old, TEMP_REPLACEMENT);
		s = s.replace(old, replacement);
		s = s.replace(TEMP_REPLACEMENT, old);
		return s;
	}

	public static StringStyle analyzeFormatLabels(String s) {
		Set<FormatLabels> format = new HashSet<FormatLabels>();
		if (s != null && !s.isEmpty()) {
			// As long as any text format applies the loop continues
			boolean matchFound = true;
			while (matchFound) {
				matchFound = false;
				for (FormatLabels formatLabel : FormatLabels.values()) {
					String markup = formatLabel.getValue();
					if (s.startsWith(markup) && s.endsWith(markup) && s.length() > markup.length() * 2) {
						format.add(formatLabel);
						s = s.substring(markup.length(), s.length() - markup.length());
						matchFound = true;
					}
				}
			}
		}
		return new StringStyle(format, s);
	}

	public Set<FormatLabels> getFormat() {
		return format;
	}

	public String getStringWithoutMarkup() {
		return stringWithoutMarkup;
	}

	@Override
	public String toString() {
		return "StringStyle [format=" + format + ", stringWithoutMarkup=" + stringWithoutMarkup + "]";
	}

}
