//
//  MKRAVPlayer.h
//  MKRAVPlayer_Example
//
//  Created by yyqxiaoyin on 2018/10/19.
//  Copyright © 2018 yyqxiaoyin. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "MKRPlayResourceStatus.h"
#import "MKRRadioResorce.h"

NS_ASSUME_NONNULL_BEGIN

typedef void(^MKRAVPlayerURLRequsetBlcok)(NSString *resourceUrl);

typedef enum : NSUInteger {
    MKRAVPlayerStateBuffering = 0,
    MKRAVPlayerStatePlaying,
    MKRAVPlayerStatePause,
    MKRAVPlayerStateStopped,
    MKRAVPlayerStateFinished,
    MKRAVPlayerStateFaild,
} MKRAVPlayerState;

typedef enum : NSUInteger {
    MKRAVPlayerPlayModeOrder = 0,   //顺序播放(列表循环)
    MKRAVPlayerPlayModeSingle,      //单曲循环
    MKRAVPlayerPlayModeRandom,      //随机播放
} MKRAVPlayerPlayMode;

@protocol MKRAVPlayerDelegate <NSObject>

@optional

/**
 如果实现了此方法
 在播放器初始化AVAsset之前 会调用此方法

 @param index 当前播放的下标
 @param completion 回调给当前播放的对象指定一个新的播放地址
 */
- (void)songPlayUrlWithIndex:(NSInteger)index completion:(MKRAVPlayerURLRequsetBlcok)completion;

/**
 播放状态发生改变
 */
- (void)playStateDidChange:(MKRAVPlayerState)playState;

/**
 资源已经准备好播放
 如果 shouldAutoPlay = YES 播放器将在这个时机调用 -(void)play 方法
 */
- (void)didReadyToPlay;

/**
 播放完成
 
 @param currentIndex 播放完成的资源在播放列表中的下表
 */
- (void)didFinishPlay:(NSInteger)currentIndex;

/**
 收到系统发出的AVPlayerItemFailedToPlayToEndTimeErrorKey 通知
 播放失败 导致不能播到结束时间
 一般是因网络状况差 在进入中断后 即调用 -(void)playbackStalled 方法之后的一段时间内会调用此方法
 可以在此方法做重新播放操作
 */
- (void)didFailedToPlayToEndTime;

/// 加载资源失败
/// @param url 加载失败的url
/// @param error 错误信息
- (void)didFailedToLoadURL:(NSString *)url error:(NSError *)error;

/**
 播放中断
 */
- (void)playbackStalled;

/// 可用缓存为空导致
- (void)stalledByCacheEmtpy;

@end

@interface MKRAVPlayer : NSObject

- (id)initWithContentURL:(NSURL *)aUrl;

- (id)initWithContentURLString:(NSString *)aUrl;

- (id)initWithPlayList:(NSArray <NSString *>*)playList;

- (id)initWithPlayList:(NSArray<NSString *> *)playList playMode:(MKRAVPlayerPlayMode)playMode;

- (id)initWithObjectsPlayList:(NSArray <id <MKRRadioResorce>>*)playList;

- (id)initWithObjectsPlayList:(NSArray<id<MKRRadioResorce>> *)playList playMode:(MKRAVPlayerPlayMode)playMode;

- (void)updatePlayList:(NSArray<NSString *> *)playList;

@property(nonatomic, weak) id<MKRAVPlayerDelegate> delegate;

/**
 当前的播放状态对象
 包含当前播放进度  播放总时间等信息
 */
@property(nonatomic, strong) MKRPlayResourceStatus *currentStatus;

/**
 当前播放的资源在播放列表中的下标
 */
@property (nonatomic, assign) NSInteger currentIndex;

/**
 是否正在播放中
 */
@property (nonatomic, assign) BOOL isPlaying;

/**
 是否允许自动播放
 */
@property (nonatomic, assign) BOOL shouldAutoPlay;

/**
 播放模式
 */
@property (nonatomic, assign) MKRAVPlayerPlayMode playMode;

/**
 播放速率
 */
@property (nonatomic, assign) float rate;

/**
 当前播放进度
 */
@property (nonatomic, assign) NSInteger currentTime;

/**
 总时长
 */
@property (nonatomic, assign) NSInteger totalTime;

/**
 播放
 */
- (void)play;

/**
 从播放列表的第index首开始播放
 */
- (void)playAtIndex:(NSInteger)index;

/**
 暂停
 */
- (void)pause;

/**
 下一首
 */
- (void)next;

/**
 上一首
 */
- (void)previous;

/**
 重置播放器 释放所有资源
 */
- (void)resetPlayer;

@end

NS_ASSUME_NONNULL_END
