package cc.winboll.studio.contacts.phonecallui;

import android.content.Context;
import android.media.AudioManager;
import android.os.Build;
import android.telecom.Call;
import android.telecom.VideoProfile;
import cc.winboll.studio.libappbase.LogUtils;

/**
 * @Author ZhanGSKen&豆包大模型<zhangsken@qq.com>
 * @Date 2025/02/13 06:58:04
 * @Describe 通话管理工具类，负责接听、挂断通话及免提控制，仅支持Android 6.0（API 23）及以上系统
 */
public class PhoneCallManager {
    // ====================== 常量定义区 ======================
    private static final String TAG = "PhoneCallManager";
    // 音频通话模式常量，与VideoProfile.STATE_AUDIO_ONLY保持一致，增强可读性
    private static final int VIDEO_PROFILE_AUDIO_ONLY = VideoProfile.STATE_AUDIO_ONLY;

    // ====================== 成员变量区 ======================
    // 静态通话实例，用于全局关联当前通话
    public static Call sCurrentCall;
    // 上下文对象
    private Context mContext;
    // 音频管理器，用于控制免提等音频相关操作
    private AudioManager mAudioManager;

    // ====================== 构造方法区 ======================
    /**
     * 构造通话管理实例
     * @param context 上下文
     */
    public PhoneCallManager(Context context) {
        this.mContext = context;
        initAudioManager();
        LogUtils.d(TAG, "PhoneCallManager: 通话管理工具初始化");
    }

    // ====================== 初始化辅助方法区 ======================
    /**
     * 初始化音频管理器
     */
    private void initAudioManager() {
        if (mContext == null) {
            LogUtils.e(TAG, "initAudioManager: 上下文为空，无法初始化音频管理器");
            return;
        }
        mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
        if (mAudioManager == null) {
            LogUtils.e(TAG, "initAudioManager: 获取音频管理器失败");
        } else {
            LogUtils.d(TAG, "initAudioManager: 音频管理器初始化成功");
        }
    }

    // ====================== 通话核心操作方法区 ======================
    /**
     * 接听当前通话
     */
    public void answer() {
        // 校验系统版本，Android6.0以下不支持telecom.Call的answer方法
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
            LogUtils.e(TAG, "answer: 系统版本低于Android6.0，不支持接听操作");
            return;
        }

        if (sCurrentCall == null) {
            LogUtils.w(TAG, "answer: 当前无通话实例，无法接听");
            return;
        }

        try {
            sCurrentCall.answer(VIDEO_PROFILE_AUDIO_ONLY);
            openSpeaker();
            LogUtils.d(TAG, "answer: 成功执行接听操作，通话模式为纯音频");
        } catch (SecurityException e) {
            LogUtils.e(TAG, "answer: 接听通话权限不足", e);
        } catch (IllegalStateException e) {
            LogUtils.e(TAG, "answer: 通话状态异常，无法接听", e);
        }
    }

    /**
     * 断开当前通话（拒接或挂断）
     */
    public void disconnect() {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
            LogUtils.e(TAG, "disconnect: 系统版本低于Android6.0，不支持挂断操作");
            return;
        }

        if (sCurrentCall == null) {
            LogUtils.w(TAG, "disconnect: 当前无通话实例，无法挂断");
            return;
        }

        try {
            sCurrentCall.disconnect();
            LogUtils.d(TAG, "disconnect: 成功执行挂断操作");
        } catch (SecurityException e) {
            LogUtils.e(TAG, "disconnect: 挂断通话权限不足", e);
        } catch (IllegalStateException e) {
            LogUtils.e(TAG, "disconnect: 通话状态异常，无法挂断", e);
        }
    }

    /**
     * 打开通话免提
     */
    public void openSpeaker() {
        if (mAudioManager == null) {
            LogUtils.w(TAG, "openSpeaker: 音频管理器为空，无法打开免提");
            return;
        }

        try {
            mAudioManager.setMode(AudioManager.MODE_IN_CALL);
            mAudioManager.setSpeakerphoneOn(true);
            LogUtils.d(TAG, "openSpeaker: 免提功能已开启");
        } catch (IllegalStateException e) {
            LogUtils.e(TAG, "openSpeaker: 音频模式设置失败，无法开启免提", e);
        }
    }

    // ====================== 资源释放方法区 ======================
    /**
     * 销毁资源，释放引用
     */
    public void destroy() {
        // 关闭免提后再释放资源，避免音频状态异常
        if (mAudioManager != null) {
            mAudioManager.setSpeakerphoneOn(false);
            mAudioManager.setMode(AudioManager.MODE_NORMAL);
            LogUtils.d(TAG, "destroy: 音频状态已恢复默认");
        }
        sCurrentCall = null;
        mAudioManager = null;
        mContext = null;
        LogUtils.d(TAG, "destroy: 通话管理工具资源已释放");
    }
}

