package cc.winboll.studio.powerbell;

import android.content.Context;
import android.os.Environment;
import cc.winboll.studio.libaes.utils.WinBoLLActivityManager;
import cc.winboll.studio.libappbase.GlobalApplication;
import cc.winboll.studio.libappbase.LogUtils;
import cc.winboll.studio.libappbase.ToastUtils;
import cc.winboll.studio.powerbell.receivers.GlobalApplicationReceiver;
import cc.winboll.studio.powerbell.utils.AppCacheUtils;
import cc.winboll.studio.powerbell.utils.AppConfigUtils;
import cc.winboll.studio.powerbell.utils.BitmapCacheUtils;
import cc.winboll.studio.powerbell.utils.NotificationManagerUtils;
import cc.winboll.studio.powerbell.views.MemoryCachedBackgroundView;
import java.io.File;

/**
 * 应用全局入口类（适配Android API 30，基于Java 7编写）
 * 核心策略：极致强制缓存 - 无论内存紧张程度，永不自动清理任何缓存（Bitmap/视图控件/路径记录）
 */
public class App extends GlobalApplication {
    // ===================== 常量定义区 =====================
    public static final String TAG = "App";

    // 组件跳转常量
    public static final String COMPONENT_EN1 = "cc.winboll.studio.powerbell.MainActivityEN1";
    public static final String COMPONENT_CN1 = "cc.winboll.studio.powerbell.MainActivityCN1";
    public static final String COMPONENT_CN2 = "cc.winboll.studio.powerbell.MainActivityCN2";

    // 动作跳转常量
    public static final String ACTION_SWITCHTO_EN1 = "cc.winboll.studio.powerbell.App.ACTION_SWITCHTO_EN1";
    public static final String ACTION_SWITCHTO_CN1 = "cc.winboll.studio.powerbell.App.ACTION_SWITCHTO_CN1";
    public static final String ACTION_SWITCHTO_CN2 = "cc.winboll.studio.powerbell.App.ACTION_SWITCHTO_CN2";

    // 缓存防护常量
    private static final String CACHE_PROTECT_TAG = "FORCE_CACHE_PROTECT";

    // ===================== 静态属性区 =====================
    // 数据配置工具
    private static AppConfigUtils sAppConfigUtils;
    private static AppCacheUtils sAppCacheUtils;
    // 全局Bitmap缓存工具（极致强制保持：一旦初始化，永不销毁）
    public static BitmapCacheUtils sBitmapCacheUtils;
    // 全局视图控件缓存工具（极致强制保持：一旦初始化，永不销毁）
    public static MemoryCachedBackgroundView sMemoryCachedBackgroundView;
    // 临时文件夹路径
    private static String sTempDirPath = "";

    // ===================== 成员属性区 =====================
    // 全局广播接收器
    private GlobalApplicationReceiver mGlobalReceiver;
    // 通知管理工具
    private NotificationManagerUtils mNotificationManager;

    // ===================== 公共方法区 =====================
    /**
     * 获取临时文件夹路径
     */
    public static String getTempDirPath() {
        return sTempDirPath;
    }

    /**
     * 获取应用配置工具实例
     */
    public static AppConfigUtils getAppConfigUtils(Context context) {
        LogUtils.d(TAG, "getAppConfigUtils() 调用，传入Context：" + context.getClass().getSimpleName());
        if (sAppConfigUtils == null) {
            sAppConfigUtils = AppConfigUtils.getInstance(context);
            LogUtils.d(TAG, "getAppConfigUtils()：AppConfigUtils实例已初始化");
        }
        return sAppConfigUtils;
    }

    /**
     * 获取应用缓存工具实例
     */
    public static AppCacheUtils getAppCacheUtils(Context context) {
        LogUtils.d(TAG, "getAppCacheUtils() 调用，传入Context：" + context.getClass().getSimpleName());
        if (sAppCacheUtils == null) {
            sAppCacheUtils = AppCacheUtils.getInstance(context);
            LogUtils.d(TAG, "getAppCacheUtils()：AppCacheUtils实例已初始化");
        }
        return sAppCacheUtils;
    }

    /**
     * 清除电池历史数据
     */
    public void clearBatteryHistory() {
        LogUtils.d(TAG, "clearBatteryHistory() 调用");
        sAppCacheUtils.clearBatteryHistory();
    }

    /**
     * 手动清理所有缓存（带严格权限控制，仅主动调用生效）
     * 极致强制缓存策略下，仅提供手动清理入口，永不自动调用
     */
    public static void manualClearAllCache() {
        LogUtils.w(TAG, CACHE_PROTECT_TAG + " 手动清理缓存调用（极致强制缓存策略下，需谨慎使用）");
        // 清理Bitmap缓存
        if (sBitmapCacheUtils != null) {
            sBitmapCacheUtils.clearAllCache();
            LogUtils.d(TAG, CACHE_PROTECT_TAG + " Bitmap缓存已手动清理");
        }
        // 清理视图控件缓存（仅清除静态引用，不销毁实例）
        if (sMemoryCachedBackgroundView != null) {
            LogUtils.d(TAG, CACHE_PROTECT_TAG + " 视图控件缓存实例保持，仅清除静态引用");
            sMemoryCachedBackgroundView = null;
        }
        LogUtils.w(TAG, CACHE_PROTECT_TAG + " 手动清理缓存完成（部分缓存实例仍可能保留在内存中）");
    }

    // ===================== 生命周期方法区 =====================
    @Override
    public void onCreate() {
        super.onCreate();
        LogUtils.d(TAG, "onCreate() 应用启动，开始初始化");

        // 初始化调试模式
        setIsDebugging(BuildConfig.DEBUG);
        LogUtils.d(TAG, "onCreate() 调试模式：" + BuildConfig.DEBUG);

        // 初始化基础工具
        initBaseTools();
        // 初始化临时文件夹
        initTempDir();
        // 初始化工具类实例（核心：极致强制缓存，永不销毁）
        initUtils();
        // 初始化广播接收器
        initReceiver();

        LogUtils.d(TAG, "onCreate() 应用初始化完成，极致强制缓存策略已启用");
    }

    @Override
    public void onTerminate() {
        super.onTerminate();
        LogUtils.d(TAG, "onTerminate() 应用终止，开始释放非缓存资源");

        // 释放Toast工具
        ToastUtils.release();
        // 释放通知工具
        releaseNotificationManager();
        // 释放广播接收器
        releaseReceiver();

        // 核心修改：应用终止时也不清理缓存，保持静态实例
        LogUtils.w(TAG, CACHE_PROTECT_TAG + " 应用终止，极致强制缓存策略生效，不清理任何缓存");

        LogUtils.d(TAG, "onTerminate() 非缓存资源释放完成，缓存实例保持");
    }

    @Override
    public void onTrimMemory(int level) {
        super.onTrimMemory(level);
        // 极致强制缓存：禁止任何缓存清理操作，仅记录日志
        LogUtils.w(TAG, CACHE_PROTECT_TAG + " onTrimMemory() 调用，内存等级level：" + level + "，极致强制保持所有缓存");
        // 记录详细缓存状态，不执行任何清理
        logDetailedCacheStatus();
    }

    @Override
    public void onLowMemory() {
        super.onLowMemory();
        // 极致强制缓存：低内存时也不清理任何缓存
        LogUtils.w(TAG, CACHE_PROTECT_TAG + " onLowMemory() 调用，极致强制保持所有缓存");
        // 记录详细缓存状态，不执行任何清理
        logDetailedCacheStatus();
    }

    // ===================== 私有初始化方法区 =====================
    /**
     * 初始化基础工具（Activity管理、Toast）
     */
    private void initBaseTools() {
        LogUtils.d(TAG, "initBaseTools() 开始初始化基础工具");
        WinBoLLActivityManager.init(this);
        ToastUtils.init(this);
        LogUtils.d(TAG, "initBaseTools() 基础工具初始化完成");
    }

    /**
     * 初始化临时文件夹（适配API 30外部存储访问）
     */
    private void initTempDir() {
        LogUtils.d(TAG, "initTempDir() 开始初始化临时文件夹");
        File picturesDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
        File powerBellDir = new File(picturesDir, "PowerBell");
        if (!powerBellDir.exists()) {
            boolean isMkSuccess = powerBellDir.mkdirs();
            LogUtils.d(TAG, "initTempDir() 文件夹创建结果：" + isMkSuccess);
        }
        sTempDirPath = powerBellDir.getAbsolutePath();
        LogUtils.d(TAG, "initTempDir() 临时文件夹路径：" + sTempDirPath);
    }

    /**
     * 初始化工具类实例（核心：极致强制缓存，一旦初始化永不销毁）
     */
    private void initUtils() {
        LogUtils.d(TAG, "initUtils() 开始初始化工具类，启用极致强制缓存策略");
        sAppConfigUtils = getAppConfigUtils(this);
        sAppCacheUtils = getAppCacheUtils(this);

        // 极致强制初始化Bitmap缓存工具（必初始化，永不销毁）
        sBitmapCacheUtils = BitmapCacheUtils.getInstance();
        LogUtils.d(TAG, "initUtils() Bitmap缓存工具已初始化（极致强制保持，永不销毁）");

        // 极致强制初始化视图控件缓存工具（必初始化，永不销毁）
        sMemoryCachedBackgroundView = MemoryCachedBackgroundView.getLastInstance(this);
        LogUtils.d(TAG, "initUtils() 视图控件缓存工具已初始化（极致强制保持，永不销毁）");

        mNotificationManager = new NotificationManagerUtils(this);
        LogUtils.d(TAG, "initUtils() 工具类初始化完成，极致强制缓存策略已生效");
    }

    /**
     * 初始化广播接收器
     */
    private void initReceiver() {
        LogUtils.d(TAG, "initReceiver() 开始初始化广播接收器");
        mGlobalReceiver = new GlobalApplicationReceiver(this);
        mGlobalReceiver.registerAction();
        LogUtils.d(TAG, "initReceiver() 广播接收器注册完成");
    }

    // ===================== 私有工具方法区 =====================
    /**
     * 释放广播接收器资源
     */
    private void releaseReceiver() {
        LogUtils.d(TAG, "releaseReceiver() 开始释放广播接收器");
        if (mGlobalReceiver != null) {
            mGlobalReceiver.unregisterAction();
            mGlobalReceiver = null;
            LogUtils.d(TAG, "releaseReceiver() 广播接收器资源已释放");
        } else {
            LogUtils.d(TAG, "releaseReceiver() 广播接收器未初始化，无需释放");
        }
    }

    /**
     * 释放通知管理工具资源
     */
    private void releaseNotificationManager() {
        LogUtils.d(TAG, "releaseNotificationManager() 开始释放通知工具");
        if (mNotificationManager != null) {
            mNotificationManager.release();
            mNotificationManager = null;
            LogUtils.d(TAG, "releaseNotificationManager() 通知工具资源已释放");
        } else {
            LogUtils.d(TAG, "releaseNotificationManager() 通知工具未初始化，无需释放");
        }
    }

    /**
     * 记录详细缓存状态（用于调试，监控极致强制缓存效果）
     */
    private void logDetailedCacheStatus() {
        LogUtils.d(TAG, "logDetailedCacheStatus() 开始记录详细缓存状态");
        // Bitmap缓存状态
        if (sBitmapCacheUtils != null) {
            LogUtils.d(TAG, CACHE_PROTECT_TAG + " Bitmap缓存工具实例有效（极致强制保持）");
            // 假设BitmapCacheUtils有获取缓存数量的方法
            try {
                int cacheCount = sBitmapCacheUtils.getCacheCount();
                LogUtils.d(TAG, CACHE_PROTECT_TAG + " Bitmap缓存数量：" + cacheCount);
            } catch (Exception e) {
                LogUtils.d(TAG, CACHE_PROTECT_TAG + " Bitmap缓存数量获取失败（不影响缓存）");
            }
        }
        // 视图控件缓存状态
        if (sMemoryCachedBackgroundView != null) {
            LogUtils.d(TAG, CACHE_PROTECT_TAG + " 视图控件缓存工具实例有效（极致强制保持）");
            // 记录视图实例总数
            int viewInstanceCount = MemoryCachedBackgroundView.getInstanceCount();
            LogUtils.d(TAG, CACHE_PROTECT_TAG + " 视图控件实例总数：" + viewInstanceCount);
        }
        LogUtils.d(TAG, "logDetailedCacheStatus() 详细缓存状态记录完成，所有缓存均极致强制保持");
    }
}

