package cc.winboll.studio.powerbell.handlers;

import android.os.Handler;
import android.os.Message;
import java.lang.ref.WeakReference;
import cc.winboll.studio.libappbase.LogUtils;
import cc.winboll.studio.powerbell.services.ControlCenterService;
import cc.winboll.studio.powerbell.models.NotificationMessage;

/**
 * @Author ZhanGSKen&豆包大模型<zhangsken@qq.com>
 * @Date 2025/12/17 13:41
 * @Describe 服务通信Handler：弱引用持有服务，避免内存泄漏，通知格式优化为 (+/-)(当前电量)(充电状态)
 */
public class ControlCenterServiceHandler extends Handler {
    // ================================== 静态常量（置顶统一管理，清晰区分消息类型）=================================
    public static final String TAG = "ControlCenterServiceHandler";
    public static final int MSG_REMIND_TEXT = 1001; // 电量提醒消息（+充电/-耗电）

    // ================================== 成员变量（弱引用服务，杜绝内存泄漏）=================================
    private final WeakReference<ControlCenterService> mwrControlCenterService;

    // ================================== 构造方法（强制传入服务，初始化弱引用）=================================
    public ControlCenterServiceHandler(ControlCenterService service) {
        LogUtils.d(TAG, "初始化Handler，绑定服务实例：" + (service != null ? service.getClass().getSimpleName() : "null"));
        this.mwrControlCenterService = new WeakReference<>(service);
    }

    // ================================== 核心消息处理（重写handleMessage，解析多参数消息）=================================
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        // 解析线程传递的完整数据：obj=提醒类型(+/-)，arg1=当前电量，arg2=充电状态(1=充电中，0=未充电)
        String remindType = (msg.obj != null) ? (String) msg.obj : "";
        int currentBattery = msg.arg1;
        boolean isCharging = msg.arg2 == 1;
        LogUtils.d(TAG, "接收消息，what：" + msg.what + "，类型：" + remindType + "，电量：" + currentBattery + "，充电状态：" + isCharging);

        // 弱引用获取服务，避免持有强引用导致内存泄漏
        ControlCenterService service = mwrControlCenterService.get();
        if (service == null) {
            LogUtils.e(TAG, "服务实例已回收，消息处理失败");
            return;
        }

        // 按消息类型分发处理，避免逻辑冗余
        switch (msg.what) {
            case MSG_REMIND_TEXT:
                handleRemindMessage(service, remindType, currentBattery, isCharging);
                break;
            default:
                LogUtils.w(TAG, "未知消息类型，what：" + msg.what);
                break;
        }
    }

    // ================================== 业务辅助方法（重构通知内容，格式：(+/-)(当前电量)(充电状态)）=================================
    /**
     * 处理电量提醒消息，构建带电量+充电状态的通知模型
     * @param service 服务实例（非空，已前置校验）
     * @param remindType 提醒类型（+：充电提醒，-：耗电提醒）
     * @param currentBattery 当前电量（0-100）
     * @param isCharging 充电状态（true=充电中，false=未充电）
     */
    private void handleRemindMessage(ControlCenterService service, String remindType, int currentBattery, boolean isCharging) {
        LogUtils.d(TAG, "开始处理提醒消息，类型：" + remindType + "，电量：" + currentBattery + "，充电状态：" + isCharging);

        // 1. 前置校验：通知工具类+提醒类型+电量有效性
        if (service.getNotificationManager() == null) {
            LogUtils.e(TAG, "通知管理工具类为空，无法发送提醒");
            return;
        }
        if (!"+".equals(remindType) && !"-".equals(remindType)) {
            LogUtils.w(TAG, "无效提醒类型，跳过发送：" + remindType);
            return;
        }
        if (currentBattery < 0 || currentBattery > 100) {
            LogUtils.w(TAG, "无效当前电量，跳过发送：" + currentBattery);
            return;
        }

        // 2. 构建通知模型，按格式拼接内容（核心优化）
        NotificationMessage remindMsg = new NotificationMessage();
        String chargeStateDesc = isCharging ? "充电中" : "未充电"; // 充电状态文字描述
        if ("+".equals(remindType)) {
            // 充电提醒：格式 (+)(当前电量)(充电状态)
            remindMsg.setTitle("充电提醒");
            remindMsg.setContent("(+) 当前电量" + currentBattery + "%，" + chargeStateDesc + "，已达标建议及时断电，保护电池寿命～");
            remindMsg.setRemindMSG("charge_remind");
            LogUtils.d(TAG, "构建充电提醒通知，内容：" + remindMsg.getContent());
        } else if ("-".equals(remindType)) {
            // 耗电提醒：格式 (-)(当前电量)(充电状态)
            remindMsg.setTitle("耗电提醒");
            remindMsg.setContent("(-) 当前电量" + currentBattery + "%，" + chargeStateDesc + "，已偏低建议及时充电，避免设备关机～");
            remindMsg.setRemindMSG("usage_remind");
            LogUtils.d(TAG, "构建耗电提醒通知，内容：" + remindMsg.getContent());
        }

        // 3. 调用服务工具类发送通知，复用现有逻辑
        service.getNotificationManager().showRemindNotification(service, remindMsg);
        LogUtils.d(TAG, "提醒通知发送完成，标题：" + remindMsg.getTitle() + "，完整内容：" + remindMsg.getContent());
    }
}

