/*
 * Copyright (c) 2017, cxy7.com
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.b3log.solo.model;

import org.b3log.solo.Keys;
import org.json.JSONArray;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * This class defines option model relevant keys.
 *
 * @author <a href="http://cxy7.com">XyCai</a>
 * @version 1.3.0.4, Feb 17, 2017
 * @since 0.6.0
 */
public final class Option {

	/**
	 * Option.
	 */
	public static final String OPTION = "option";

	/**
	 * Options.
	 */
	public static final String OPTIONS = "options";

	/**
	 * Key of option value.
	 */
	public static final String OPTION_VALUE = "optionValue";

	/**
	 * Key of option category.
	 */
	public static final String OPTION_CATEGORY = "optionCategory";

	// oId constants
	/**
	 * Key of broadcast chance expiration time.
	 */
	public static final String ID_C_BROADCAST_CHANCE_EXPIRATION_TIME = "broadcastChanceExpirationTime";

	/**
	 * Key of Qiniu access key.
	 */
	public static final String ID_C_QINIU_ACCESS_KEY = "qiniuAccessKey";

	/**
	 * Key of Qiniu secret key.
	 */
	public static final String ID_C_QINIU_SECRET_KEY = "qiniuSecretKey";

	/**
	 * Key of Qiniu domain.
	 */
	public static final String ID_C_QINIU_DOMAIN = "qiniuDomain";

	/**
	 * Key of Qiniu bucket.
	 */
	public static final String ID_C_QINIU_BUCKET = "qiniuBucket";

	/**
	 * Key of blog title.
	 */
	public static final String ID_C_BLOG_TITLE = "blogTitle";

	/**
	 * Key of blog subtitle.
	 */
	public static final String ID_C_BLOG_SUBTITLE = "blogSubtitle";

	/**
	 * Key of relevant articles display count.
	 */
	public static final String ID_C_RELEVANT_ARTICLES_DISPLAY_CNT = "relevantArticlesDisplayCount";

	/**
	 * Key of random articles display count.
	 */
	public static final String ID_C_RANDOM_ARTICLES_DISPLAY_CNT = "randomArticlesDisplayCount";

	/**
	 * Key of external relevant articles display count.
	 */
	public static final String ID_C_EXTERNAL_RELEVANT_ARTICLES_DISPLAY_CNT = "externalRelevantArticlesDisplayCount";

	/**
	 * Key of recent article display count.
	 */
	public static final String ID_C_RECENT_ARTICLE_DISPLAY_CNT = "recentArticleDisplayCount";

	/**
	 * Key of recent comment display count.
	 */
	public static final String ID_C_RECENT_COMMENT_DISPLAY_CNT = "recentCommentDisplayCount";

	/**
	 * Key of most used tag display count.
	 */
	public static final String ID_C_MOST_USED_TAG_DISPLAY_CNT = "mostUsedTagDisplayCount";

	/**
	 * Key of most comment article display count.
	 */
	public static final String ID_C_MOST_COMMENT_ARTICLE_DISPLAY_CNT = "mostCommentArticleDisplayCount";

	/**
	 * Key of most view article display count.
	 */
	public static final String ID_C_MOST_VIEW_ARTICLE_DISPLAY_CNT = "mostViewArticleDisplayCount";

	/**
	 * Key of article list display count.
	 */
	public static final String ID_C_ARTICLE_LIST_DISPLAY_COUNT = "articleListDisplayCount";

	/**
	 * Key of article list pagination window size.
	 */
	public static final String ID_C_ARTICLE_LIST_PAGINATION_WINDOW_SIZE = "articleListPaginationWindowSize";

	/**
	 * Key of administrator's email.
	 */
	public static final String ID_C_ADMIN_EMAIL = "adminEmail";

	/**
	 * Key of locale string.
	 */
	public static final String ID_C_LOCALE_STRING = "localeString";

	/**
	 * Key of time zone id.
	 */
	public static final String ID_C_TIME_ZONE_ID = "timeZoneId";

	/**
	 * Key of notice board.
	 */
	public static final String ID_C_NOTICE_BOARD = "noticeBoard";

	/**
	 * Key of HTML head.
	 */
	public static final String ID_C_HTML_HEAD = "htmlHead";

	/**
	 * Key of meta keywords.
	 */
	public static final String ID_C_META_KEYWORDS = "metaKeywords";

	/**
	 * Key of meta description.
	 */
	public static final String ID_C_META_DESCRIPTION = "metaDescription";

	/**
	 * Key of article update hint flag.
	 */
	public static final String ID_C_ENABLE_ARTICLE_UPDATE_HINT = "enableArticleUpdateHint";

	/**
	 * Key of signs.
	 */
	public static final String ID_C_SIGNS = "signs";

	/**
	 * Key of key of Solo.
	 */
	public static final String ID_C_KEY_OF_SOLO = "keyOfSolo";

	/**
	 * Key of allow visit draft via permalink.
	 */
	public static final String ID_C_ALLOW_VISIT_DRAFT_VIA_PERMALINK = "allowVisitDraftViaPermalink";

	/**
	 * Key of allow register.
	 */
	public static final String ID_C_ALLOW_REGISTER = "allowRegister";

	/**
	 * Key of version.
	 */
	public static final String ID_C_VERSION = "version";

	/**
	 * Key of article list display style.
	 *
	 * <p>
	 * Optional values:
	 * <ul>
	 * <li>"titleOnly"</li>
	 * <li>"titleAndContent"</li>
	 * <li>"titleAndAbstract"</li>
	 * </ul>
	 * </p>
	 */
	public static final String ID_C_ARTICLE_LIST_STYLE = "articleListStyle";

	/**
	 * Key of article/page comment-able.
	 */
	public static final String ID_C_COMMENTABLE = "commentable";

	/**
	 * Key of feed (Atom/RSS) output mode.
	 *
	 * <p>
	 * Optional values:
	 * <ul>
	 * <li>"abstract"</li>
	 * <li>"fullContent"</li>
	 * </ul>
	 * </p>
	 */
	public static final String ID_C_FEED_OUTPUT_MODE = "feedOutputMode";

	/**
	 * Key of feed (Atom/RSS) output entry count.
	 */
	public static final String ID_C_FEED_OUTPUT_CNT = "feedOutputCnt";

	/**
	 * Key of editor type.
	 *
	 * Optional values:
	 * <p>
	 * <ul>
	 * <li>"tinyMCE"</li>
	 * <li>"CodeMirror-Markdown"</li>
	 * <li>"KindEditor"</li>
	 * </ul>
	 * </p>
	 */
	public static final String ID_C_EDITOR_TYPE = "editorType";

	/**
	 * Key of skins.
	 */
	public static final String ID_C_SKINS = "skins";

	/**
	 * Key of skin dir name.
	 */
	public static final String ID_C_SKIN_DIR_NAME = "skinDirName";

	/**
	 * Key of skin name.
	 */
	public static final String ID_C_SKIN_NAME = "skinName";

	/**
	 * Key of reply notification template body.
	 */
	public static final String ID_C_REPLY_NOTI_TPL_BODY = "replyNotiTplBody";

	/**
	 * Key of reply notification template subject.
	 */
	public static final String ID_C_REPLY_NOTI_TPL_SUBJECT = "replyNotiTplSubject";

	/**
	 * Key of footer content.
	 */
	public static final String ID_C_FOOTER_CONTENT = "footerContent";

	// Category constants
	/**
	 * Broadcast.
	 */
	public static final String CATEGORY_C_BROADCAST = "broadcast";

	/**
	 * Qiniu.
	 */
	public static final String CATEGORY_C_QINIU = "qiniu";

	/**
	 * Preference.
	 */
	public static final String CATEGORY_C_PREFERENCE = "preference";

	/**
	 * Default preference.
	 *
	 * @author <a href="http://cxy7.com">XyCai</a>
	 * @version 2.1.0.9, Nov 23, 2015
	 * @since 0.3.1
	 */
	public static final class DefaultPreference {

		/**
		 * Logger.
		 */
		private static Logger logger = LoggerFactory.getLogger(DefaultPreference.class);

		/**
		 * Default recent article display count.
		 */
		public static final int DEFAULT_RECENT_ARTICLE_DISPLAY_COUNT = 10;

		/**
		 * Default recent comment display count.
		 */
		public static final int DEFAULT_RECENT_COMMENT_DISPLAY_COUNT = 10;

		/**
		 * Default most used tag display count.
		 */
		public static final int DEFAULT_MOST_USED_TAG_DISPLAY_COUNT = 20;

		/**
		 * Default article list display count.
		 */
		public static final int DEFAULT_ARTICLE_LIST_DISPLAY_COUNT = 20;

		/**
		 * Default article list pagination window size.
		 */
		public static final int DEFAULT_ARTICLE_LIST_PAGINATION_WINDOW_SIZE = 15;

		/**
		 * Default most comment article display count.
		 */
		public static final int DEFAULT_MOST_COMMENT_ARTICLE_DISPLAY_COUNT = 5;

		/**
		 * Default blog title.
		 */
		public static final String DEFAULT_BLOG_TITLE = "Solo 示例";

		/**
		 * Default blog subtitle.
		 */
		public static final String DEFAULT_BLOG_SUBTITLE = "Java 开源博客";

		/**
		 * Default skin directory name.
		 */
		public static final String DEFAULT_SKIN_DIR_NAME = "9IPHP";

		/**
		 * Default language.
		 */
		public static final String DEFAULT_LANGUAGE = "zh_CN";

		/**
		 * Default time zone.
		 *
		 * @see java.util.TimeZone#getAvailableIDs()
		 */
		public static final String DEFAULT_TIME_ZONE = "Asia/Shanghai";

		/**
		 * Default enable article update hint.
		 */
		public static final String DEFAULT_ENABLE_ARTICLE_UPDATE_HINT = "true";

		/**
		 * Default notice board.
		 */
		public static final String DEFAULT_NOTICE_BOARD = "Open Source, Open Mind, <br/>Open Sight, Open Future!";

		/**
		 * Default meta keywords..
		 */
		public static final String DEFAULT_META_KEYWORDS = "Solo,Java 博客,开源";

		/**
		 * Default meta description..
		 */
		public static final String DEFAULT_META_DESCRIPTION = "An open source blog with Java. Java 开源博客";

		/**
		 * Default HTML head to append.
		 */
		public static final String DEFAULT_HTML_HEAD = "";

		/**
		 * Default footer content.
		 */
		public static final String DEFAULT_FOOTER_CONTENT = "";

		/**
		 * Default relevant articles display count.
		 */
		public static final int DEFAULT_RELEVANT_ARTICLES_DISPLAY_COUNT = 5;

		/**
		 * Default random articles display count.
		 */
		public static final int DEFAULT_RANDOM_ARTICLES_DISPLAY_COUNT = 5;

		/**
		 * Default external relevant articles display count.
		 */
		public static final int DEFAULT_EXTERNAL_RELEVANT_ARTICLES_DISPLAY_COUNT = 5;

		/**
		 * Most view articles display count.
		 */
		public static final int DEFAULT_MOST_VIEW_ARTICLES_DISPLAY_COUNT = 5;

		/**
		 * Default signs.
		 */
		public static final String DEFAULT_SIGNS;

		/**
		 * Default allow visit draft via permalink.
		 */
		public static final String DEFAULT_ALLOW_VISIT_DRAFT_VIA_PERMALINK = "false";

		/**
		 * Default allow register.
		 */
		public static final String DEFAULT_ALLOW_REGISTER = "false";

		/**
		 * Default allow comment article/page.
		 */
		public static final String DEFAULT_COMMENTABLE = "true";

		/**
		 * Default article list display style.
		 */
		public static final String DEFAULT_ARTICLE_LIST_STYLE = "titleAndAbstract";

		/**
		 * Default key of solo.
		 */
		public static final String DEFAULT_KEY_OF_SOLO = "Your key";

		/**
		 * Default reply notification template.
		 */
		public static final String DEFAULT_REPLY_NOTIFICATION_TEMPLATE;

		/**
		 * Default feed output mode.
		 */
		public static final String DEFAULT_FEED_OUTPUT_MODE = "abstract";

		/**
		 * Default feed output entry count.
		 */
		public static final int DEFAULT_FEED_OUTPUT_CNT = 10;

		/**
		 * Default editor type.
		 */
		public static final String DEFAULT_EDITOR_TYPE = "CodeMirror-Markdown";

		static {
			final JSONArray signs = new JSONArray();

			final int signLength = 4;

			try {
				for (int i = 0; i < signLength; i++) {
					final JSONObject sign = new JSONObject();

					sign.put(Keys.OBJECT_ID, i);
					signs.put(sign);

					sign.put(Sign.SIGN_HTML, "");
				}

				// Sign(id=0) is the 'empty' sign, used for article user needn't
				// a sign
				DEFAULT_SIGNS = signs.toString();

				final JSONObject replyNotificationTemplate = new JSONObject();

				replyNotificationTemplate.put("subject", "${blogTitle}: New reply of your comment");
				replyNotificationTemplate.put("body",
						"Your comment on post[<a href='${postLink}'>"
								+ "${postTitle}</a>] received an reply: <p>${replier}"
								+ ": <span><a href='${replyURL}'>${replyContent}</a></span></p>");
				DEFAULT_REPLY_NOTIFICATION_TEMPLATE = replyNotificationTemplate.toString();
			} catch (final Exception e) {
				logger.error("Creates sign error!", e);
				throw new IllegalStateException(e);
			}
		}

		/**
		 * Private default constructor.
		 */
		private DefaultPreference() {
		}
	}

	/**
	 * Private constructor.
	 */
	private Option() {
	}
}
