package com.narutohuo.xindazhou.push.receiver

import android.content.Context
import android.content.Intent
import android.os.Bundle
import cn.jpush.android.api.CmdMessage
import cn.jpush.android.api.CustomMessage
import cn.jpush.android.api.JPushInterface
import cn.jpush.android.api.JPushMessage
import cn.jpush.android.api.NotificationMessage
import cn.jpush.android.service.JPushMessageReceiver
import com.narutohuo.xindazhou.core.log.ILog
import com.narutohuo.xindazhou.push.factory.PushServiceFactory
import com.narutohuo.xindazhou.push.helper.TagAliasOperatorHelper
import com.narutohuo.xindazhou.push.impl.PushServiceImpl

/**
 * 极光推送消息接收器（完全封装在模块内部）
 * 
 * 继承自 JPushMessageReceiver，接收极光推送的所有回调
 * 业务层不需要知道这个类的存在，所有消息会自动回调到 PushService 的监听器
 */
class JPushReceiver : JPushMessageReceiver() {
    
    companion object {
        private const val TAG = "JPushReceiver"
        
        init {
            ILog.d(TAG, "========== JPushReceiver 类被加载 ==========")
        }
    }
    
    init {
        ILog.d(TAG, "========== JPushReceiver 实例被创建 ==========")
    }
    
    /**
     * 收到自定义消息（透传消息）
     */
    override fun onMessage(context: Context, customMessage: CustomMessage) {
        ILog.d(TAG, "[onMessage] title=${customMessage.title}, message=${customMessage.message}")
                
        // 解析 extras
                val extrasMap = try {
            // extras 已经是 Map<String, String> 类型
            @Suppress("UNCHECKED_CAST")
            (customMessage.extra as? Map<String, String>) ?: emptyMap()
                } catch (e: Exception) {
            ILog.e(TAG, "解析 extras 失败", e)
            emptyMap<String, String>()
                }
                
                // 调用 PushService 处理消息
                val pushService = PushServiceFactory.getInstance()
        (pushService as? PushServiceImpl)?.handleReceivedMessage(
            title = customMessage.title ?: "",
            content = customMessage.message ?: "",
            extras = extrasMap,
            messageId = customMessage.messageId
        )
    }
    
    /**
     * 通知消息到达（未点击）
     */
    override fun onNotifyMessageArrived(context: Context, message: NotificationMessage) {
        ILog.d(TAG, "========== 收到推送通知 ==========")
        ILog.d(TAG, "标题: ${message.notificationTitle}")
        ILog.d(TAG, "内容: ${message.notificationContent}")
        ILog.d(TAG, "MessageID: ${message.msgId}")
        ILog.d(TAG, "======================================")
        
        // 通知到达时，可以在这里做一些统计或日志记录
        // 不需要特殊处理，系统会自动显示通知
    }
    
    /**
     * 用户点击了通知
     */
    override fun onNotifyMessageOpened(context: Context, message: NotificationMessage) {
        ILog.d(TAG, "[onNotifyMessageOpened] title=${message.notificationTitle}, content=${message.notificationContent}")
        
        // 清除角标（通知点击后，清除应用图标上的数字角标）
        try {
            JPushInterface.setBadgeNumber(context, 0)
            ILog.d(TAG, "已清除角标数字")
        } catch (e: Exception) {
            ILog.e(TAG, "清除角标失败", e)
        }
        
        // 解析 extras
                val extrasMap = try {
            // notificationExtras 已经是 Map<String, String> 类型
            @Suppress("UNCHECKED_CAST")
            (message.notificationExtras as? Map<String, String>)?.toMutableMap() ?: mutableMapOf()
                } catch (e: Exception) {
            ILog.e(TAG, "解析 extras 失败", e)
            mutableMapOf<String, String>()
                }
                
                // 调用 PushService 处理通知点击
                val pushService = PushServiceFactory.getInstance()
        (pushService as? PushServiceImpl)?.handleNotificationClick(
            title = message.notificationTitle ?: "",
            content = message.notificationContent ?: "",
            extras = extrasMap,
            messageId = message.msgId
        )
            }
    
    /**
     * 用户清除了通知
     */
    override fun onNotifyMessageDismiss(context: Context, message: NotificationMessage) {
        ILog.d(TAG, "[onNotifyMessageDismiss] title=${message.notificationTitle}")
        // 通知被清除，可以在这里做一些统计或日志记录
    }
    
    /**
     * 用户点击了通知栏的多按钮
     */
    override fun onMultiActionClicked(context: Context, intent: Intent) {
        ILog.d(TAG, "[onMultiActionClicked] 用户点击了通知栏按钮")
        
        val nActionExtra = intent.extras?.getString(JPushInterface.EXTRA_NOTIFICATION_ACTION_EXTRA)
        if (nActionExtra == null) {
            ILog.d(TAG, "ACTION_NOTIFICATION_CLICK_ACTION nActionExtra is null")
            return
        }
        
        // 开发者根据不同 Action 携带的 extra 字段来分配不同的动作
        ILog.d(TAG, "[onMultiActionClicked] nActionExtra=$nActionExtra")
        
        // 这里可以根据不同的 action 执行不同的逻辑
        // 例如：
        // when (nActionExtra) {
        //     "action1" -> // 处理按钮1的点击
        //     "action2" -> // 处理按钮2的点击
        // }
    }
    
    /**
     * 注册成功回调
     */
    override fun onRegister(context: Context, registrationId: String) {
        ILog.d(TAG, "========== JPush 注册成功 ==========")
        ILog.d(TAG, "✅✅✅ RegistrationID: $registrationId ✅✅✅")
        ILog.d(TAG, "请将这个 RegistrationID 复制到极光推送后台进行测试推送")
        ILog.d(TAG, "======================================")
        
        // 注册成功，可以在这里保存 registrationId 或发送给服务器
        // 也可以发送广播通知其他组件
        val pushService = PushServiceFactory.getInstance()
        (pushService as? PushServiceImpl)?.handleRegisterSuccess(registrationId)
    }
    
    /**
     * 连接状态回调
     */
    override fun onConnected(context: Context, isConnected: Boolean) {
        ILog.d(TAG, "========== JPush 连接状态变化 ==========")
        ILog.d(TAG, "连接状态: $isConnected")
        ILog.d(TAG, "======================================")
        
        if (!isConnected) {
            ILog.w(TAG, "⚠️⚠️⚠️ JPush 连接失败 ⚠️⚠️⚠️")
            ILog.w(TAG, "请检查网络连接和 AppKey 配置")
        }
        
        // 连接状态变化，可以在这里更新 UI 或做其他处理
        val pushService = PushServiceFactory.getInstance()
        (pushService as? PushServiceImpl)?.handleConnectedStatus(isConnected)
    }
    
    /**
     * 命令结果回调
     */
    override fun onCommandResult(context: Context, cmdMessage: CmdMessage) {
        ILog.d(TAG, "[onCommandResult] cmd=${cmdMessage.cmd}, errorCode=${cmdMessage.errorCode}")
        
        // 命令执行结果，用于调试
    }
    
    /**
     * 标签操作结果回调
     */
    override fun onTagOperatorResult(context: Context, jPushMessage: JPushMessage) {
        val sequence = jPushMessage.sequence
        ILog.d(TAG, "[onTagOperatorResult] sequence=$sequence, tags=${jPushMessage.tags}, errorCode=${jPushMessage.errorCode}")
        
        // 使用 TagAliasOperatorHelper 处理
        TagAliasOperatorHelper.getInstance().onTagOperatorResult(context, jPushMessage)
        
        // 调用 PushService 处理标签操作结果
        val pushService = PushServiceFactory.getInstance()
        (pushService as? PushServiceImpl)?.handleTagOperatorResult(jPushMessage)
        
        super.onTagOperatorResult(context, jPushMessage)
    }
    
    /**
     * 检查标签操作结果回调
     */
    override fun onCheckTagOperatorResult(context: Context, jPushMessage: JPushMessage) {
        val sequence = jPushMessage.sequence
        ILog.d(TAG, "[onCheckTagOperatorResult] sequence=$sequence, checkTag=${jPushMessage.checkTag}, errorCode=${jPushMessage.errorCode}")
        
        // 使用 TagAliasOperatorHelper 处理
        TagAliasOperatorHelper.getInstance().onCheckTagOperatorResult(context, jPushMessage)
        
        // 调用 PushService 处理检查标签结果
        val pushService = PushServiceFactory.getInstance()
        (pushService as? PushServiceImpl)?.handleCheckTagOperatorResult(jPushMessage)
        
        super.onCheckTagOperatorResult(context, jPushMessage)
    }
    
    /**
     * 别名操作结果回调
     */
    override fun onAliasOperatorResult(context: Context, jPushMessage: JPushMessage) {
        val sequence = jPushMessage.sequence
        ILog.d(TAG, "[onAliasOperatorResult] sequence=$sequence, alias=${jPushMessage.alias}, errorCode=${jPushMessage.errorCode}")
        
        // 使用 TagAliasOperatorHelper 处理
        TagAliasOperatorHelper.getInstance().onAliasOperatorResult(context, jPushMessage)
        
        // 调用 PushService 处理别名操作结果
        val pushService = PushServiceFactory.getInstance()
        (pushService as? PushServiceImpl)?.handleAliasOperatorResult(jPushMessage)
        
        super.onAliasOperatorResult(context, jPushMessage)
    }
    
    /**
     * 手机号操作结果回调
     */
    override fun onMobileNumberOperatorResult(context: Context, jPushMessage: JPushMessage) {
        val sequence = jPushMessage.sequence
        ILog.d(TAG, "[onMobileNumberOperatorResult] sequence=$sequence, mobileNumber=${jPushMessage.mobileNumber}, errorCode=${jPushMessage.errorCode}")
        
        // 使用 TagAliasOperatorHelper 处理
        TagAliasOperatorHelper.getInstance().onMobileNumberOperatorResult(context, jPushMessage)
        
        // 调用 PushService 处理手机号操作结果
        val pushService = PushServiceFactory.getInstance()
        (pushService as? PushServiceImpl)?.handleMobileNumberOperatorResult(jPushMessage)
        
        super.onMobileNumberOperatorResult(context, jPushMessage)
    }
    
    /**
     * 通知设置检查回调
     */
    override fun onNotificationSettingsCheck(context: Context, isOn: Boolean, source: Int) {
        ILog.d(TAG, "[onNotificationSettingsCheck] isOn=$isOn, source=$source")
        
        // 通知设置状态检查结果
        // isOn: true 表示通知已开启，false 表示通知已关闭
        // source: 来源
        
        super.onNotificationSettingsCheck(context, isOn, source)
    }
}
