package com.umeng.soexample.music;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.graphics.Bitmap;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Binder;
import android.os.Handler;
import android.os.IBinder;
import android.provider.MediaStore;
import android.util.Log;
import android.widget.RemoteViews;


import com.umeng.soexample.App;
import com.umeng.soexample.Constants;
import com.umeng.soexample.R;

import java.io.IOException;
import java.util.List;
import java.util.Random;


public class MusicService extends Service {

    private App myApplication;
    // private static int SAMPLE_RATE_IN_HZ = 8000;
    private MediaPlayer mMediaPlayer;
    private AudioManager mAudioManager;
    private List<Playlist> playingList;

    private Playlist currentMusic;
    private Playlist lastMusic;
    public static final String PAUSE_BROADCAST_NAME = "com.dlkj.music.pause.broadcast";
    public static final String NEXT_BROADCAST_NAME = "com.dlkj.music.next.broadcast";
    public static final String PRE_BROADCAST_NAME = "com.dlkj.music.pre.broadcast";
    public static final int PAUSE_FLAG = 0x1;
    public static final int NEXT_FLAG = 0x2;
    public static final int PRE_FLAG = 0x3;
    public boolean isLoop = false;
    public boolean isRandom = false;

    // 通知栏
    private NotificationManager mNotificationManager;
    private int NOTIFICATION_ID = 0x1;
//    private ControlBroadcast mConrolBroadcast;
    public final IBinder mBinder = new MusicBinder();
    private Random random = new Random();

    @Override
    public void onCreate() {
        super.onCreate();
        mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
        mMediaPlayer = new MediaPlayer();
        mMediaPlayer.setOnCompletionListener(mp -> {
            if (musicModeActivity != null) {
                musicModeActivity.next_img.performClick();
            }
        });
        myApplication = (App) getApplication();
//        handler.sendEmptyMessageDelayed(1002, 200);
        mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        IntentFilter filter = new IntentFilter();
        filter.addAction(PAUSE_BROADCAST_NAME);
        filter.addAction(NEXT_BROADCAST_NAME);
        filter.addAction(PRE_BROADCAST_NAME);
        registerReceiver(mConrolBroadcast, filter);
    }

    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }

    @Override
    public boolean onUnbind(Intent intent) {
        return super.onUnbind(intent);
    }

    public class MusicBinder extends Binder {
        public MusicService getService() {
            return MusicService.this;
        }
    }

    public void setCurrentPlayList(List<Playlist> list) {
        playingList = list;
    }

    /**
     * 设置当前播放音乐
     *
     * @param music 要播放的音乐
     */
    public void setCurrentPlayMusic(Playlist music) {
        if (mMediaPlayer == null) {
            return;
        }
        if (currentMusic == null || !music.equals(currentMusic)) {
            Uri uri = Uri.withAppendedPath(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, "" + music.get_mid());
            try {
                mMediaPlayer.reset();
                mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
                mMediaPlayer.setDataSource(this, uri);
                mMediaPlayer.setLooping(isLoop);
                mMediaPlayer.prepare();
                this.currentMusic = music;
            } catch (Exception e) {
                e.printStackTrace();
            }
        } else {
            try {
                mMediaPlayer.prepare();
                mMediaPlayer.seekTo(0);
            } catch (IllegalStateException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 获取当前播放音乐的音乐列表
     *
     * @return 音乐列表
     */
    public Playlist getCurrentPlay() {
        return currentMusic;
    }

    /**
     * 播放音乐
     */
    public void play() {
        Log.e("play", "is play");
        if (!mMediaPlayer.isPlaying()) {
            mMediaPlayer.start();
        }
        musicModeActivity.startImgRotate();
        sendBroadcast(new Intent(Constants.ACTION_CHANGE_MUSIC));
    }

    /**
     * 暂停播放
     */
    public void pause() {
        if (MusicModeActivity.isStart) {
            musicModeActivity.stopImgRotate();
        }
        if (mMediaPlayer.isPlaying()) {
            mMediaPlayer.pause();
        }
//        handler.sendEmptyMessageDelayed(1003, 1000);
    }

    /**
     * 停止播放
     */
    public void stop() {
        if (mMediaPlayer.isPlaying()) {
            mMediaPlayer.stop();
        }
    }

    /**
     * 播放下一首
     */
    public void next() {
        Log.e("service", "next");
        if (playingList == null) {
            return;
        }
        stop();
        if (playingList != null) {
            int index = playingList.indexOf(currentMusic);
            lastMusic = currentMusic;
            Playlist tempMusic;
            if (!isRandom) {
                if (index < playingList.size() - 1 && playingList.size() != 0) {
                    tempMusic = playingList.get(index + 1);
                } else {
                    tempMusic = playingList.get(0);
                }
            } else {
                tempMusic = playingList.get(getRandomIndex(playingList.size()));
            }
            if (tempMusic != null) {
                setCurrentPlayMusic(tempMusic);
                currentMusic = tempMusic;
                play();
            }
        }
    }

    /**
     * 播放上一首
     */
    public void last() {
        if (playingList == null) {
            return;
        }
        stop();
        if (!isRandom) {
            if (playingList != null) {
                int index = playingList.indexOf(currentMusic);
                if (index != -1 && index != 0) {
                    lastMusic = playingList.get(index - 1);
                } else {
                    lastMusic = playingList.get(playingList.size() - 1);
                }
            }
        } else {
            Log.e("previous", "随机");
            lastMusic = playingList.get(getRandomIndex(playingList.size()));
        }
        setCurrentPlayMusic(lastMusic);
        currentMusic = lastMusic;
        play();
    }

    /**
     * 是否正在播放音乐
     *
     * @return true: 正在播放 false: 无音乐播放
     */
    public boolean isPlaying() {
        return mMediaPlayer != null && mMediaPlayer.isPlaying();
    }

    public void setLoop(boolean isLoop) {
        mMediaPlayer.setLooping(isLoop);
        this.isLoop = isLoop;
    }

    public boolean isLoop() {
        return isLoop;
    }

    public void setRandom(boolean isRandom) {
        mMediaPlayer.setLooping(false);
        this.isRandom = isRandom;
        Log.e("isRandom", "" + isRandom);
    }

    public boolean isRandom() {
        return isRandom;
    }

    public int getCurrentTime() {
        return mMediaPlayer.getCurrentPosition();
    }

    public void setMediaPlayTime(int progress) {
        mMediaPlayer.seekTo(progress);
    }

    public int getDuration() {
        return mMediaPlayer.getDuration();
    }

    public int getAudioVolume() {
        return mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
    }

    public void setAudioVolume(int progress) {
        mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, progress, 0);
    }

    public MediaPlayer getMediaPlayer() {
        return mMediaPlayer;
    }

    public List<Playlist> getPlayList() {
        return playingList;
    }

    private int getRandomIndex(int size) {
        return new Random().nextInt(size);
    }

//    private Handler handler = new Handler() {
//        @Override
//        public void handleMessage(android.os.Message msg) {
//            switch (msg.what) {
//                case 1001:
//                    break;
//                case 1002:
//                    if (myApplication.BlueServiceIsConnnected() && myApplication.mMusicServer != null && myApplication.mMusicServer.isPlaying()) {
//                        int a = 400 + random.nextInt(300);
//                        myApplication.sendBlueOrder(a);
//                    }
//                    handler.sendEmptyMessageDelayed(1002, 50);
//                    break;
//                case 1003:
//                    if (myApplication.BlueServiceIsConnnected()) {
//                        myApplication.sendBlueOrder(400);
//                    }
//                    break;
//            }
//        }
//    };

    @Override
    public void onDestroy() {
        super.onDestroy();
        if (mMediaPlayer != null) {
            mMediaPlayer.stop();
            mMediaPlayer.release();
            mMediaPlayer = null;
        }
        if (mConrolBroadcast != null) {
            unregisterReceiver(mConrolBroadcast);
        }
    }

    private Handler mHandler;

    public void setHandler(Handler handler) {
        this.mHandler = handler;
    }

    private MusicModeActivity musicModeActivity;

    public void setMusicContext(Context c) {
        this.musicModeActivity = (MusicModeActivity) c;
    }

    /**
     * ********** 以下为更新通知栏方法 ************
     */
    public void updateNotification(Bitmap bitmap) {
        if (currentMusic == null) {
            return;
        }
        Intent intent = new Intent(getApplicationContext(), MusicModeActivity.class);
        PendingIntent pi = PendingIntent.getActivity(getApplicationContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
        RemoteViews remoteViews = new RemoteViews(this.getPackageName(), R.layout.notification);
        Notification notification = new Notification.Builder(this)
                .setLargeIcon(bitmap)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setTicker(currentMusic.getTitle())
                .setContentIntent(pi)
                .setPriority(Notification.PRIORITY_MAX)
                .build();

        notification.contentView = remoteViews;
        notification.flags |= Notification.FLAG_ONGOING_EVENT;

        if (bitmap != null) {
            remoteViews.setImageViewBitmap(R.id.image, bitmap);
        } else {
            remoteViews.setImageViewResource(R.id.image, R.mipmap.img_album_background);
        }
        remoteViews.setTextViewText(R.id.bbs_type_Title, currentMusic.getTitle());
        remoteViews.setTextViewText(R.id.text, currentMusic.getArtist());
        if(isPlaying()){
            remoteViews.setImageViewResource(R.id.iv_pause, R.drawable.nc_pause);
        }else {
            remoteViews.setImageViewResource(R.id.iv_pause, R.mipmap.play);
        }
        // mNotificationManager.notify(NOTIFICATION_ID, mNotification);

        // 此处action不能是一样的 如果一样的 接受的flag参数只是第一个设置的值
        Intent pauseIntent = new Intent(PAUSE_BROADCAST_NAME);
        pauseIntent.putExtra("FLAG", PAUSE_FLAG);
        PendingIntent pausePIntent = PendingIntent.getBroadcast(this, 0, pauseIntent, 0);
        remoteViews.setOnClickPendingIntent(R.id.iv_pause, pausePIntent);

        Intent nextIntent = new Intent(NEXT_BROADCAST_NAME);
        nextIntent.putExtra("FLAG", NEXT_FLAG);
        PendingIntent nextPIntent = PendingIntent.getBroadcast(this, 0, nextIntent, 0);
        remoteViews.setOnClickPendingIntent(R.id.iv_next, nextPIntent);

        Intent preIntent = new Intent(PRE_BROADCAST_NAME);
        preIntent.putExtra("FLAG", PRE_FLAG);
        PendingIntent prePIntent = PendingIntent.getBroadcast(this, 0, preIntent, 0);
        remoteViews.setOnClickPendingIntent(R.id.iv_previous, prePIntent);

//        startForeground(NOTIFICATION_ID, notification);
        mNotificationManager.notify(NOTIFICATION_ID, notification);
    }

    public void cancelNotification() {
//        stopForeground(true);
        mNotificationManager.cancel(NOTIFICATION_ID);
    }

    private BroadcastReceiver mConrolBroadcast = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            switch (intent.getAction()){
                case PAUSE_BROADCAST_NAME:
                    mHandler.sendEmptyMessage(PAUSE_FLAG);
                    break;
                case NEXT_BROADCAST_NAME:
                    mHandler.sendEmptyMessage(NEXT_FLAG);
                    break;
                case PRE_BROADCAST_NAME:
                    mHandler.sendEmptyMessage(PRE_FLAG);
                    break;
            }
        }
    };

}