package com.zlm.hp.receiver;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.text.TextUtils;

import com.zlm.down.entity.DownloadTask;
import com.zlm.hp.constants.ConfigInfo;
import com.zlm.hp.constants.Constants;
import com.zlm.hp.entity.AudioInfo;


/**
 * @Description: 音频监听
 * @author: zhangliangming
 * @date: 2018-10-09 21:36
 **/
public class AudioBroadcastReceiver {
    /**
     * audio的receiver的action
     */
    private static final String RECEIVER_ACTION = "com.zlm.hp.receiver.audio.action";

    /**
     * code key
     */
    private static final String ACTION_CODE_KEY = "com.zlm.hp.receiver.audio.action.code.key";

    /**
     * bundle key
     */
    public static final String ACTION_BUNDLEKEY = "com.zlm.hp.receiver.audio.action.bundle.key";

    /**
     * data key
     */
    public static final String ACTION_DATA_KEY = "com.zlm.hp.receiver.audio.action.data.key";

    /**
     * null
     */
    public static final int ACTION_CODE_NULL = 0;

    /**
     * 播放初始化
     */
    public static final int ACTION_CODE_INIT = 1;

    /**
     * 播放
     */
    public static final int ACTION_CODE_PLAY = 2;
    /**
     * 播放
     */
    public static final int ACTION_CODE_PLAYING = 3;

    /**
     * 播放本地歌曲
     */
    public static final int ACTION_CODE_SERVICE_PLAYLOCALSONG = 4;

    /**
     * 播放网络歌曲
     */
    public static final int ACTION_CODE_SERVICE_PLAYNETSONG = 5;

    /**
     * 停止播放歌曲
     */
    public static final int ACTION_CODE_STOP = 6;

    /**
     * seekto歌曲
     */
    public static final int ACTION_CODE_SEEKTO = 7;


    /**
     * 在线歌曲下载中
     */
    public static final int ACTION_CODE_DOWNLOADONLINESONG = 8;

    /**
     * 歌词加载完成
     */
    public static final int ACTION_CODE_LRCLOADED = 9;

    /**
     * 重新加载歌手写真
     */
    public static final int ACTION_CODE_RELOADSINGERIMG = 10;

    /**
     * 歌词重新加载
     */
    public static final int ACTION_CODE_LRCRELOADED = 11;

    /**
     * 歌词重新加载中
     */
    public static final int ACTION_CODE_LRCRELOADING = 12;

    /**
     * 通知栏 play
     */
    public static final int ACTION_CODE_NOTIFY_PLAY = 13;

    /**
     * 通知栏 pause
     */
    public static final int ACTION_CODE_NOTIFY_PAUSE = 14;

    /**
     * 通知栏 next
     */
    public static final int ACTION_CODE_NOTIFY_NEXT = 15;

    /**
     * 通知栏 pre
     */
    public static final int ACTION_CODE_NOTIFY_PRE = 16;

    /**
     * 通知栏 unlock
     */
    public static final int ACTION_CODE_NOTIFY_UNLOCK = 17;

    /**
     * 通知栏 lock
     */
    public static final int ACTION_CODE_NOTIFY_LOCK = 18;

    /**
     * 通知栏 桌面歌词隐藏
     */
    public static final int ACTION_CODE_NOTIFY_DESLRC_HIDE_ACTION = 19;
    public static final int ACTION_CODE_NOTIFY_DESLRC = 20;

    /**
     * 通知栏 桌面歌词显示
     */
    public static final int ACTION_CODE_NOTIFY_DESLRC_SHOW_ACTION = 21;

    /**
     * 通知栏 歌手头像加载完成
     */
    public static final int ACTION_CODE_NOTIFY_SINGERICONLOADED = 22;

    /**
     * 锁屏歌词切换
     */
    public static final int ACTION_CODE_LOCK_LRC_CHANGE = 23;

    /**
     * 更新本地歌曲
     */
    public static final int ACTION_CODE_UPDATE_LOCAL = 24;

    /**
     * 更新喜欢歌曲
     */
    public static final int ACTION_CODE_UPDATE_LIKE = 25;

    /**
     * 更新最近歌曲
     */
    public static final int ACTION_CODE_UPDATE_RECENT = 26;

    /**
     * 更新下载歌曲
     */
    public static final int ACTION_CODE_UPDATE_DOWNLOAD = 27;

    /**
     * 歌曲下载等待中
     */
    public static final int ACTION_CODE_DOWNLOAD_WAIT = 28;

    /**
     * 歌曲下载中
     */
    public static final int ACTION_CODE_DOWNLOAD_SONG = 29;

    /**
     * 歌曲暂停
     */
    public static final int ACTION_CODE_DOWNLOAD_PAUSE = 30;

    /**
     * 歌曲取消
     */
    public static final int ACTION_CODE_DOWNLOAD_CANCEL = 31;

    /**
     * 歌曲完成
     */
    public static final int ACTION_CODE_DOWNLOAD_FINISH = 32;

    /**
     * 歌曲下载出错
     */
    public static final int ACTION_CODE_DOWNLOAD_ERROR = 33;

    /**
     * 在线歌曲下载完成
     */
    public static final int ACTION_CODE_DOWNLOADONEDLINESONG = 34;


    /**
     * 更新播放列表歌曲
     */
    public static final int ACTION_CODE_UPDATE_PLAYLIST = 35;

    /**
     * 歌词保存成功
     */
    public static final int ACTION_CODE_MAKE_SUCCESS = 36;

    /**
     * 视频下载中
     */
    public static final int ACTION_CODE_VIDEO_DOWNLOADING = 37;

    /**
     * 视频下载完成
     */
    public static final int ACTION_CODE_VIDEO_DOWNLOADED = 38;

    /**
     * 视频停止播放
     */
    public static final int ACTION_CODE_VIDEO_STOP = 39;
    /**
     * 关闭视频窗体
     */
    public static final int ACTION_VIDEO_CLOSE = 41;
    /**
     * 播放网络视频
     */
    public static final int ACTION_CODE_PLAYNETVIDEO = 40;

    private BroadcastReceiver mBroadcastReceiver;
    private IntentFilter mIntentFilter;
    private AudioReceiverListener mReceiverListener;

    public AudioBroadcastReceiver() {
        mIntentFilter = new IntentFilter();
        mIntentFilter.addAction(RECEIVER_ACTION);
    }

    /**
     * 注册广播
     *
     * @param context
     */
    public void registerReceiver(Context context) {

        mBroadcastReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {

                if (mReceiverListener != null) {
                    int code = intent.getIntExtra(ACTION_CODE_KEY, -1);
                    if (code != -1) {
                        mReceiverListener.onReceive(context, intent, code);
                    }
                }
            }
        };
        context.registerReceiver(mBroadcastReceiver, mIntentFilter, Constants.RECEIVER_PERMISSION, null);
    }

    /**
     * 发广播
     *
     * @param context
     * @param code
     * @param bundleKey
     * @param bundleValue
     */
    public static void sendReceiver(Context context, int code, String bundleKey, Bundle bundleValue) {
        Intent intent = new Intent(RECEIVER_ACTION);
        intent.putExtra(ACTION_CODE_KEY, code);
        if (!TextUtils.isEmpty(bundleKey) && bundleValue != null) {
            intent.putExtra(bundleKey, bundleValue);
        }
        intent.setFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
        context.sendBroadcast(intent, Constants.RECEIVER_PERMISSION);
    }


    /**
     * 发广播
     *
     * @param context
     * @param code
     */
    public static void sendReceiver(Context context, int code) {
        sendReceiver(context, code, null, null);
    }

    /**
     * 发null广播
     *
     * @param context
     */
    public static void sendNullReceiver(Context context) {

        //清空当前的播放的索引
        ConfigInfo configInfo = ConfigInfo.obtain();
        configInfo.setPlayHash("");
        configInfo.save();

        sendReceiver(context, ACTION_CODE_NULL, null, null);
    }

    /**
     * 发null广播
     *
     * @param context
     */
    public static void sendStopReceiver(Context context) {
        sendReceiver(context, ACTION_CODE_STOP, null, null);
    }

    /**
     * 发播放中广播
     */
    public static void sendPlayingReceiver(Context context, AudioInfo audioInfo) {
        Bundle bundle = new Bundle();
        bundle.putParcelable(ACTION_DATA_KEY, audioInfo);
        sendReceiver(context, ACTION_CODE_PLAYING, ACTION_BUNDLEKEY, bundle);
    }

    /**
     * 发播放广播
     */
    public static void sendPlayReceiver(Context context, AudioInfo audioInfo) {
        Bundle bundle = new Bundle();
        bundle.putParcelable(ACTION_DATA_KEY, audioInfo);
        sendReceiver(context, ACTION_CODE_PLAY, ACTION_BUNDLEKEY, bundle);
    }

    /**
     * 播放网络歌曲
     *
     * @param audioInfo
     */
    public static void sendPlayNetSongReceiver(Context context, AudioInfo audioInfo) {
        Bundle bundle = new Bundle();
        bundle.putParcelable(ACTION_DATA_KEY, audioInfo);
        sendReceiver(context, ACTION_CODE_SERVICE_PLAYNETSONG, ACTION_BUNDLEKEY, bundle);
    }

    /**
     * init歌曲
     *
     * @param audioInfo
     */
    public static void sendPlayInitReceiver(Context context, AudioInfo audioInfo) {
        Bundle bundle = new Bundle();
        bundle.putParcelable(ACTION_DATA_KEY, audioInfo);
        sendReceiver(context, ACTION_CODE_INIT, ACTION_BUNDLEKEY, bundle);
    }


    /**
     * 播放本地歌曲
     *
     * @param audioInfo
     */
    public static void sendPlayLocalSongReceiver(Context context, AudioInfo audioInfo) {
        Bundle bundle = new Bundle();
        bundle.putParcelable(ACTION_DATA_KEY, audioInfo);
        sendReceiver(context, ACTION_CODE_SERVICE_PLAYLOCALSONG, ACTION_BUNDLEKEY, bundle);
    }

    /**
     * 在线歌曲下载中
     *
     * @param context
     * @param task
     */
    public static void sendDownloadingOnlineSongReceiver(Context context, DownloadTask task) {
        Bundle bundle = new Bundle();
        bundle.putParcelable(ACTION_DATA_KEY, task);
        sendReceiver(context, ACTION_CODE_DOWNLOADONLINESONG, ACTION_BUNDLEKEY, bundle);

    }
    /**
     * 关闭视频播放窗口消息
     *
     * @param context
     */
    public static void sendVideoCloserReceiver(Context context) {
        sendReceiver(context, ACTION_VIDEO_CLOSE, null, null);
    }
    /**
     * 在线歌曲下载完成
     *
     * @param context
     * @param task
     */
    public static void sendDownloadedOnlineSongReceiver(Context context, DownloadTask task) {
        Bundle bundle = new Bundle();
        bundle.putParcelable(ACTION_DATA_KEY, task);
        sendReceiver(context, ACTION_CODE_DOWNLOADONEDLINESONG, ACTION_BUNDLEKEY, bundle);

    }


    /**
     * 歌曲下载中
     *
     * @param context
     * @param task
     */
    public static void sendDownloadingSongReceiver(Context context, DownloadTask task) {
        Bundle bundle = new Bundle();
        bundle.putParcelable(ACTION_DATA_KEY, task);
        sendReceiver(context, ACTION_CODE_DOWNLOAD_SONG, ACTION_BUNDLEKEY, bundle);

    }

    /**
     * 歌曲等待中
     *
     * @param context
     * @param task
     */
    public static void sendDownloadWaitReceiver(Context context, DownloadTask task) {
        Bundle bundle = new Bundle();
        bundle.putParcelable(ACTION_DATA_KEY, task);
        sendReceiver(context, ACTION_CODE_DOWNLOAD_WAIT, ACTION_BUNDLEKEY, bundle);

    }

    /**
     * 歌曲暂停中
     *
     * @param context
     * @param task
     */
    public static void sendDownloadPauseReceiver(Context context, DownloadTask task) {
        Bundle bundle = new Bundle();
        bundle.putParcelable(ACTION_DATA_KEY, task);
        sendReceiver(context, ACTION_CODE_DOWNLOAD_PAUSE, ACTION_BUNDLEKEY, bundle);

    }

    /**
     * 歌曲暂停中
     *
     * @param context
     * @param task
     */
    public static void sendDownloadCancelReceiver(Context context, DownloadTask task) {
        Bundle bundle = new Bundle();
        bundle.putParcelable(ACTION_DATA_KEY, task);
        sendReceiver(context, ACTION_CODE_DOWNLOAD_CANCEL, ACTION_BUNDLEKEY, bundle);

    }

    /**
     * 歌曲完成
     *
     * @param context
     * @param task
     */
    public static void sendDownloadFinishReceiver(Context context, DownloadTask task) {
        Bundle bundle = new Bundle();
        bundle.putParcelable(ACTION_DATA_KEY, task);
        sendReceiver(context, ACTION_CODE_DOWNLOAD_FINISH, ACTION_BUNDLEKEY, bundle);

    }

    /**
     * 歌曲出错
     *
     * @param context
     * @param task
     */
    public static void sendDownloadErrorReceiver(Context context, DownloadTask task) {
        Bundle bundle = new Bundle();
        bundle.putParcelable(ACTION_DATA_KEY, task);
        sendReceiver(context, ACTION_CODE_DOWNLOAD_ERROR, ACTION_BUNDLEKEY, bundle);

    }


    /**
     * seekto歌曲
     *
     * @param audioInfo
     */
    public static void sendSeektoSongReceiver(Context context, AudioInfo audioInfo) {
        Bundle bundle = new Bundle();
        bundle.putParcelable(ACTION_DATA_KEY, audioInfo);
        sendReceiver(context, ACTION_CODE_SEEKTO, ACTION_BUNDLEKEY, bundle);
    }

    /**
     * 发lrc loaded
     *
     * @param context
     */
    public static void sendLrcLoadedReceiver(Context context, String hash) {
        Bundle bundle = new Bundle();
        bundle.putString(ACTION_DATA_KEY, hash);
        sendReceiver(context, ACTION_CODE_LRCLOADED, ACTION_BUNDLEKEY, bundle);
    }

    /**
     * 发lrc reloading
     *
     * @param context
     */
    public static void sendLrcReLoadingReceiver(Context context, String hash) {
        Bundle bundle = new Bundle();
        bundle.putString(ACTION_DATA_KEY, hash);
        sendReceiver(context, ACTION_CODE_LRCRELOADING, ACTION_BUNDLEKEY, bundle);
    }

    /**
     * 发lrc reloaded
     *
     * @param context
     */
    public static void sendLrcReLoadedReceiver(Context context, String hash) {
        Bundle bundle = new Bundle();
        bundle.putString(ACTION_DATA_KEY, hash);
        sendReceiver(context, ACTION_CODE_LRCRELOADED, ACTION_BUNDLEKEY, bundle);
    }

    /**
     * @param context
     * @param hash
     */
    public static void sendReloadSingerImgReceiver(Context context, String hash) {
        Bundle bundle = new Bundle();
        bundle.putString(ACTION_DATA_KEY, hash);
        sendReceiver(context, ACTION_CODE_RELOADSINGERIMG, ACTION_BUNDLEKEY, bundle);
    }

    /**
     * 获取通知栏 intent
     *
     * @param code
     * @return
     */
    public static Intent getNotifiyIntent(int code) {
        Intent intent = new Intent(RECEIVER_ACTION);
        intent.putExtra(ACTION_CODE_KEY, code);
        intent.setFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
        return intent;
    }

    /**
     * 发送notify 图片加载完成广播
     *
     * @param context
     */
    public static void sendNotifiyImgLoadedReceiver(Context context, AudioInfo audioInfo) {
        Bundle bundle = new Bundle();
        bundle.putParcelable(ACTION_DATA_KEY, audioInfo);
        sendReceiver(context, ACTION_CODE_NOTIFY_SINGERICONLOADED, ACTION_BUNDLEKEY, bundle);
    }

    /**
     * 喜欢歌曲
     *
     * @param context
     * @param hash
     */
    public static void sendLikeReceiver(Context context, String hash) {
        Bundle bundle = new Bundle();
        bundle.putString(ACTION_DATA_KEY, hash);
        sendReceiver(context, ACTION_CODE_UPDATE_LIKE, ACTION_BUNDLEKEY, bundle);
    }

    /**
     * 发送制作歌词成功广播
     *
     * @param context
     */
    public static void sendMakeLrcSuccessReceiver(Context context, String hash) {
        Bundle bundle = new Bundle();
        bundle.putString(ACTION_DATA_KEY, hash);
        sendReceiver(context, ACTION_CODE_MAKE_SUCCESS, ACTION_BUNDLEKEY, bundle);
    }

    /**
     * 在线视频下载中
     *
     * @param context
     * @param task
     */
    public static void sendDownloadingOnlineVideoReceiver(Context context, DownloadTask task) {
        Bundle bundle = new Bundle();
        bundle.putParcelable(ACTION_DATA_KEY, task);
        sendReceiver(context, ACTION_CODE_VIDEO_DOWNLOADING, ACTION_BUNDLEKEY, bundle);

    }

    /**
     * 在线视频下载完成
     *
     * @param context
     * @param task
     */
    public static void sendDownloadedOnlineVideoReceiver(Context context, DownloadTask task) {
        Bundle bundle = new Bundle();
        bundle.putParcelable(ACTION_DATA_KEY, task);
        sendReceiver(context, ACTION_CODE_VIDEO_DOWNLOADED, ACTION_BUNDLEKEY, bundle);

    }

    /**
     * 在线视频停止
     *
     * @param context
     * @param task
     */
    public static void sendOnlineVideoStopReceiver(Context context, DownloadTask task) {
        Bundle bundle = new Bundle();
        bundle.putParcelable(ACTION_DATA_KEY, task);
        sendReceiver(context, ACTION_CODE_VIDEO_STOP, ACTION_BUNDLEKEY, bundle);

    }

    /**
     * 播放网络视频
     *
     * @param task
     */
    public static void sendPlayNetVideoReceiver(Context context, DownloadTask task) {
        Bundle bundle = new Bundle();
        bundle.putParcelable(ACTION_DATA_KEY, task);
        sendReceiver(context, ACTION_CODE_PLAYNETVIDEO, ACTION_BUNDLEKEY, bundle);

    }


    /**
     * 取消注册广播
     */
    public void unregisterReceiver(Context context) {
        if (mBroadcastReceiver != null) {
            context.unregisterReceiver(mBroadcastReceiver);
        }
    }

    public interface AudioReceiverListener {
        void onReceive(Context context, Intent intent, int code);
    }

    public void setReceiverListener(AudioReceiverListener audioReceiverListener) {
        this.mReceiverListener = audioReceiverListener;
    }
}
