/*
 * 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.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.preference.PreferenceManager;

import net.micode.notes.R;

/**
 * 主题管理器
 * 负责应用主题的切换、管理和应用，支持浅色、深色和跟随系统主题
 */
public class ThemeManager {
    // 主题模式偏好设置键
    private static final String PREF_THEME_MODE = "theme_mode";
    // 跟随系统主题偏好设置键
    private static final String PREF_FOLLOW_SYSTEM = "follow_system_theme";

    // 主题模式常量
    public static final int THEME_LIGHT = 0;   // 浅色主题
    public static final int THEME_DARK = 1;    // 深色主题
    public static final int THEME_SYSTEM = 2;  // 跟随系统主题

    /**
     * 为Activity应用主题
     * 根据当前主题设置应用相应的主题样式
     * @param activity 要应用主题的Activity
     */
    public static void applyTheme(Activity activity) {
        int themeMode = getThemeMode(activity);

        switch (themeMode) {
            case THEME_LIGHT:
                // 应用浅色主题
                activity.setTheme(R.style.AppTheme);
                break;
            case THEME_DARK:
                // 应用深色主题
                activity.setTheme(R.style.AppTheme_Dark);
                break;
            case THEME_SYSTEM:
                // 跟随系统主题
                if (isSystemDarkMode(activity)) {
                    activity.setTheme(R.style.AppTheme_Dark);
                } else {
                    activity.setTheme(R.style.AppTheme);
                }
                break;
        }
    }

    /**
     * 为Activity应用笔记主题
     * 专门用于笔记编辑界面的主题设置
     * @param activity 要应用主题的Activity
     */
    public static void applyNoteTheme(Activity activity) {
        int themeMode = getThemeMode(activity);

        switch (themeMode) {
            case THEME_LIGHT:
                // 应用浅色笔记主题
                activity.setTheme(R.style.NoteTheme);
                break;
            case THEME_DARK:
                // 应用深色笔记主题
                activity.setTheme(R.style.NoteTheme_Dark);
                break;
            case THEME_SYSTEM:
                // 跟随系统主题
                if (isSystemDarkMode(activity)) {
                    activity.setTheme(R.style.NoteTheme_Dark);
                } else {
                    activity.setTheme(R.style.NoteTheme);
                }
                break;
        }
    }
    
    /**
     * 获取当前主题模式
     * @param context 上下文对象
     * @return 主题模式常量
     */
    public static int getThemeMode(Context context) {
        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
        return prefs.getInt(PREF_THEME_MODE, THEME_SYSTEM);
    }

    /**
     * 设置主题模式
     * @param context 上下文对象
     * @param themeMode 要设置的主题模式
     */
    public static void setThemeMode(Context context, int themeMode) {
        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
        prefs.edit().putInt(PREF_THEME_MODE, themeMode).apply();
    }

    /**
     * 检查系统是否处于深色模式
     * @param context 上下文对象
     * @return true表示系统处于深色模式，false表示浅色模式
     */
    public static boolean isSystemDarkMode(Context context) {
        int nightModeFlags = context.getResources().getConfiguration().uiMode
                & Configuration.UI_MODE_NIGHT_MASK;
        return nightModeFlags == Configuration.UI_MODE_NIGHT_YES;
    }

    /**
     * 检查当前主题是否为深色模式
     * @param context 上下文对象
     * @return true表示当前为深色主题，false表示浅色主题
     */
    public static boolean isDarkMode(Context context) {
        int themeMode = getThemeMode(context);

        switch (themeMode) {
            case THEME_DARK:
                return true;
            case THEME_LIGHT:
                return false;
            case THEME_SYSTEM:
                return isSystemDarkMode(context);
            default:
                return false;
        }
    }

    /**
     * 获取主题名称用于显示
     * @param context 上下文对象
     * @param themeMode 主题模式
     * @return 主题名称字符串
     */
    public static String getThemeName(Context context, int themeMode) {
        switch (themeMode) {
            case THEME_LIGHT:
                return context.getString(R.string.theme_light);
            case THEME_DARK:
                return context.getString(R.string.theme_dark);
            case THEME_SYSTEM:
                return context.getString(R.string.theme_system);
            default:
                return context.getString(R.string.theme_system);
        }
    }
    
    /**
     * Get background color for current theme
     */
    public static int getBackgroundColor(Context context) {
        if (isDarkMode(context)) {
            return context.getResources().getColor(R.color.backgroundDark);
        } else {
            return context.getResources().getColor(android.R.color.white);
        }
    }
    
    /**
     * Get text color for current theme
     */
    public static int getTextColor(Context context) {
        if (isDarkMode(context)) {
            return context.getResources().getColor(R.color.textPrimaryDark);
        } else {
            return context.getResources().getColor(android.R.color.black);
        }
    }
    
    /**
     * Get secondary text color for current theme
     */
    public static int getSecondaryTextColor(Context context) {
        if (isDarkMode(context)) {
            return context.getResources().getColor(R.color.textSecondaryDark);
        } else {
            return context.getResources().getColor(android.R.color.darker_gray);
        }
    }
    
    /**
     * Get note background resource based on color ID and theme
     * 修改为使用动态着色，统一使用蓝色背景
     */
    public static int getNoteBackgroundResource(Context context, int colorId) {
        boolean isDark = isDarkMode(context);

        // 深色模式使用深色背景
        if (isDark) {
            return R.drawable.edit_dark;
        } else {
            // 浅色模式统一使用蓝色背景，通过动态着色实现其他颜色
            return ResourceParser.NoteBgResources.getNoteBgResource(colorId);
        }
    }
    
    /**
     * Get tag color for theme
     */
    public static int getTagColor(Context context, int tagColorId) {
        boolean isDark = isDarkMode(context);
        
        if (isDark) {
            switch (tagColorId) {
                case 0: return context.getResources().getColor(R.color.tagBlueDark);
                case 1: return context.getResources().getColor(R.color.tagGreenDark);
                case 2: return context.getResources().getColor(R.color.tagOrangeDark);
                case 3: return context.getResources().getColor(R.color.tagRedDark);
                case 4: return context.getResources().getColor(R.color.tagPurpleDark);
                case 5: return context.getResources().getColor(R.color.tagGrayDark);
                default: return context.getResources().getColor(R.color.tagBlueDark);
            }
        } else {
            switch (tagColorId) {
                case 0: return context.getResources().getColor(android.R.color.holo_blue_bright);
                case 1: return context.getResources().getColor(android.R.color.holo_green_light);
                case 2: return context.getResources().getColor(android.R.color.holo_orange_light);
                case 3: return context.getResources().getColor(android.R.color.holo_red_light);
                case 4: return context.getResources().getColor(android.R.color.holo_purple);
                case 5: return context.getResources().getColor(android.R.color.darker_gray);
                default: return context.getResources().getColor(android.R.color.holo_blue_bright);
            }
        }
    }
}
