/*
Copyright 2015 CrushPaper.com.

This file is part of CrushPaper.

CrushPaper is free software: you can redistribute it and/or modify
it under the terms of version 3 of the GNU Affero General Public
License as published by the Free Software Foundation.

CrushPaper is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU Affero General Public License for more details.

You should have received a copy of the GNU Affero General Public License
along with CrushPaper.  If not, see <http://www.gnu.org/licenses/>.
 */
package com.crushpaper;

import org.apache.commons.lang3.StringEscapeUtils;

/** A utility class that helps with creation of JSON data. */
public class JsonBuilder {
	/** Returns the value JSON encoded and quoted. */
	static String quote(String value) {
		if (value == null) {
			return "null";
		}

		return "\"" + StringEscapeUtils.escapeJson(value) + "\"";
	}

	/** Appends indentation to `result`. */
	static public void appendIndentation(int level, StringBuilder result) {
		for (int i = 0; i < level; ++i)
			result.append("  ");
	}

	/** Adds a key and value to a JSON StringBuilder. */
	static boolean addPropertyToJsonString(StringBuilder result, Object value,
			boolean addedAnyYet, String key, int indentationLevel) {
		appendIndentation(indentationLevel, result);
		return addPropertyToJsonString(result, value, addedAnyYet, key);
	}

	/** Adds a key and value to a JSON StringBuilder. */
	static boolean addPropertyToJsonString(StringBuilder result, Object value,
			boolean addedAnyYet, String key) {
		if (value == null) {
			return addedAnyYet;
		}

		if (value instanceof Boolean && !((Boolean) value)) {
			return addedAnyYet;
		}

		if (addedAnyYet) {
			result.append(",\n");
		}

		result.append("\"");
		result.append(key);
		result.append("\": ");

		if (value instanceof String) {
			result.append(quote((String) value));
		} else {
			result.append(value);
		}

		return true;
	}

}