/*
 * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
 *
 * 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 net.micode.notes.tool;

import android.content.Context;
import android.preference.PreferenceManager;

import net.micode.notes.R;
import net.micode.notes.ui.NotesPreferenceActivity;

public class ResourceParser {

    /**
     * 定义背景颜色常量。
     */
    public static final int YELLOW           = 0;
    public static final int BLUE             = 1;
    public static final int WHITE            = 2;
    public static final int GREEN            = 3;
    public static final int RED              = 4;

    /**
     * 默认背景颜色。
     */
    public static final int BG_DEFAULT_COLOR = YELLOW;

    /**
     * 定义字体大小常量。
     */
    public static final int TEXT_SMALL       = 0;
    public static final int TEXT_MEDIUM      = 1;
    public static final int TEXT_LARGE       = 2;
    public static final int TEXT_SUPER       = 3;

    /**
     * 默认字体大小。
     */
    public static final int BG_DEFAULT_FONT_SIZE = TEXT_MEDIUM;

    /**
     * 笔记背景资源类，用于获取编辑状态下的笔记背景资源。
     */
    public static class NoteBgResources {
        /**
         * 用于存储编辑状态下不同颜色主题的笔记背景资源id。
         * 每个资源id对应一个不同的背景图片，用于在编辑笔记时显示不同颜色主题的背景。
         */
        private final static int [] BG_EDIT_RESOURCES = new int [] {
            R.drawable.edit_yellow,      // 编辑状态下黄色主题的笔记背景
            R.drawable.edit_blue,       // 编辑状态下蓝色主题的笔记背景
            R.drawable.edit_white,      // 编辑状态下白色主题的笔记背景
            R.drawable.edit_green,      // 编辑状态下绿色主题的笔记背景
            R.drawable.edit_red         // 编辑状态下红色主题的笔记背景
        };

        /**
         * 用于存储编辑状态下不同颜色主题的笔记标题背景资源id。
         * 每个资源id对应一个不同的背景图片，用于在编辑笔记时显示不同颜色主题的标题背景。
         */
        private final static int [] BG_EDIT_TITLE_RESOURCES = new int [] {
            R.drawable.edit_title_yellow,     // 编辑状态下黄色主题的笔记标题背景
            R.drawable.edit_title_blue,      // 编辑状态下蓝色主题的笔记标题背景
            R.drawable.edit_title_white,     // 编辑状态下白色主题的笔记标题背景
            R.drawable.edit_title_green,     // 编辑状态下绿色主题的笔记标题背景
            R.drawable.edit_title_red        // 编辑状态下红色主题的笔记标题背景
        };

        /**
         * 获取笔记背景资源。
         * @param id 背景资源id索引。
         * @return 对应的笔记背景资源id。
         */
        public static int getNoteBgResource(int id) {
            return BG_EDIT_RESOURCES[id];
        }

        /**
         * 获取笔记标题背景资源。
         * @param id 标题背景资源id索引。
         * @return 对应的笔记标题背景资源id。
         */
        public static int getNoteTitleBgResource(int id) {
            return BG_EDIT_TITLE_RESOURCES[id];
        }
    }

    /**
     * 获取默认背景资源id。
     * @param context 上下文。
     * @return 默认背景资源id。
     */
    public static int getDefaultBgId(Context context) {
        if (PreferenceManager.getDefaultSharedPreferences(context).getBoolean(
                NotesPreferenceActivity.PREFERENCE_SET_BG_COLOR_KEY, false)) {
            return (int) (Math.random() * NoteBgResources.BG_EDIT_RESOURCES.length);
        } else {
            return BG_DEFAULT_COLOR;
        }
    }

    /**
     * 笔记项背景资源类，用于获取列表中笔记项的背景资源。
     */
    public static class NoteItemBgResources {
        /**
         * 用于存储列表中处于第一个位置的笔记项的背景资源id。
         * 每个资源id对应一个不同的背景图片，用于区分不同颜色主题的笔记项。
         */
        private final static int [] BG_FIRST_RESOURCES = new int [] {
            R.drawable.list_yellow_up,   // 黄色主题的列表第一个笔记项背景
            R.drawable.list_blue_up,    // 蓝色主题的列表第一个笔记项背景
            R.drawable.list_white_up,   // 白色主题的列表第一个笔记项背景
            R.drawable.list_green_up,   // 绿色主题的列表第一个笔记项背景
            R.drawable.list_red_up      // 红色主题的列表第一个笔记项背景
        };

        /**
         * 用于存储列表中处于中间位置的笔记项的背景资源id。
         * 每个资源id对应一个不同的背景图片，用于区分不同颜色主题的笔记项。
         */
        private final static int [] BG_NORMAL_RESOURCES = new int [] {
            R.drawable.list_yellow_middle,  // 黄色主题的列表中间笔记项背景
            R.drawable.list_blue_middle,   // 蓝色主题的列表中间笔记项背景
            R.drawable.list_white_middle,  // 白色主题的列表中间笔记项背景
            R.drawable.list_green_middle,  // 绿色主题的列表中间笔记项背景
            R.drawable.list_red_middle     // 红色主题的列表中间笔记项背景
        };

        /**
         * 用于存储列表中处于最后一个位置的笔记项的背景资源id。
         * 每个资源id对应一个不同的背景图片，用于区分不同颜色主题的笔记项。
         */
        private final static int [] BG_LAST_RESOURCES = new int [] {
            R.drawable.list_yellow_down,   // 黄色主题的列表最后一个笔记项背景
            R.drawable.list_blue_down,    // 蓝色主题的列表最后一个笔记项背景
            R.drawable.list_white_down,   // 白色主题的列表最后一个笔记项背景
            R.drawable.list_green_down,   // 绿色主题的列表最后一个笔记项背景
            R.drawable.list_red_down      // 红色主题的列表最后一个笔记项背景
        };

        /**
         * 用于存储列表中单个笔记项（列表中只有一个笔记项时）的背景资源id。
         * 每个资源id对应一个不同的背景图片，用于区分不同颜色主题的笔记项。
         */
        private final static int [] BG_SINGLE_RESOURCES = new int [] {
            R.drawable.list_yellow_single,  // 黄色主题的单个笔记项背景
            R.drawable.list_blue_single,   // 蓝色主题的单个笔记项背景
            R.drawable.list_white_single,  // 白色主题的单个笔记项背景
            R.drawable.list_green_single,  // 绿色主题的单个笔记项背景
            R.drawable.list_red_single     // 红色主题的单个笔记项背景
        };
        /**
         * 获取列表中第一个笔记项的背景资源。
         * @param id 背景资源id。
         * @return 对应的资源id。
         */
        public static int getNoteBgFirstRes(int id) {
            return BG_FIRST_RESOURCES[id];
        }

        /**
         * 获取列表中最后一个笔记项的背景资源。
         * @param id 背景资源id。
         * @return 对应的资源id。
         */
        public static int getNoteBgLastRes(int id) {
            return BG_LAST_RESOURCES[id];
        }

        /**
         * 获取列表中单个笔记项的背景资源。
         * @param id 背景资源id。
         * @return 对应的资源id。
         */
        public static int getNoteBgSingleRes(int id) {
            return BG_SINGLE_RESOURCES[id];
        }

        /**
         * 获取列表中普通笔记项的背景资源。
         * @param id 背景资源id。
         * @return 对应的资源id。
         */
        public static int getNoteBgNormalRes(int id) {
            return BG_NORMAL_RESOURCES[id];
        }

        /**
         * 获取文件夹背景资源。
         * @return 文件夹背景资源id。
         */
        public static int getFolderBgRes() {
            return R.drawable.list_folder;
        }
    }

    /**
     * 部件背景资源类，用于获取小部件的背景资源。
     */
    public static class WidgetBgResources {
        private final static int [] BG_2X_RESOURCES = new int [] {
            R.drawable.widget_2x_yellow,
            R.drawable.widget_2x_blue,
            R.drawable.widget_2x_white,
            R.drawable.widget_2x_green,
            R.drawable.widget_2x_red,
        };

        /**
         * 获取2x小部件背景资源。
         * @param id 背景资源id。
         * @return 对应的资源id。
         */
        public static int getWidget2xBgResource(int id) {
            return BG_2X_RESOURCES[id];
        }

        private final static int [] BG_4X_RESOURCES = new int [] {
            R.drawable.widget_4x_yellow,
            R.drawable.widget_4x_blue,
            R.drawable.widget_4x_white,
            R.drawable.widget_4x_green,
            R.drawable.widget_4x_red
        };

        /**
         * 获取4x小部件背景资源。
         * @param id 背景资源id。
         * @return 对应的资源id。
         */
        public static int getWidget4xBgResource(int id) {
            return BG_4X_RESOURCES[id];
        }
    }

    /**
     * 文本外观资源类，用于获取不同字体大小的资源。
     */
    public static class TextAppearanceResources {
        private final static int [] TEXTAPPEARANCE_RESOURCES = new int [] {
            R.style.TextAppearanceNormal,
            R.style.TextAppearanceMedium,
            R.style.TextAppearanceLarge,
            R.style.TextAppearanceSuper
        };

        /**
         * 获取文本外观资源。
         * @param id 文本外观资源id。
         * @return 对应的资源id。
         */
        public static int getTexAppearanceResource(int id) {
            /**
             * HACKME: 修复存储在共享首选项中的资源id的bug。
             * id可能大于资源的长度，在这种情况下，
             * 返回{@link ResourceParser#BG_DEFAULT_FONT_SIZE}
             */
            if (id >= TEXTAPPEARANCE_RESOURCES.length) {
                return BG_DEFAULT_FONT_SIZE;
            }
            return TEXTAPPEARANCE_RESOURCES[id];
        }

        /**
         * 获取资源大小。
         * @return 资源数组的长度。
         */
        public static int getResourcesSize() {
            return TEXTAPPEARANCE_RESOURCES.length;
        }
    }
}