//
//  MKRWIFIDeviceManager.h
//  MKRAVPlayer
//
//  Created by yyqxiaoyin on 2019/4/16.
//

#import <Foundation/Foundation.h>
#import "MKRUPnPDevice.h"
#import "MKRM3UListModel.h"
#import "MKRRadioResorce.h"

#define _MKRWIFIDeviceManager [MKRWIFIDeviceManager shareManager]

@protocol MKRWIFIDeviceManagerDelegate <NSObject>

@optional

/** 搜索到新设备 */
- (void)didSearchNewDevice:(NSDictionary *)newDecice;

/// 收到设备广播的播放状态改变
/// @param playState 改变后的播放状态
/// @param deviceUUID 状态改变的设备的UUID
- (void)didReceivePlayStateChange:(MKRResourcePlayState)playState;

/// 收到设备广播的播放频道改变
/// @param channel 频道号
/// @param deviceUUID 频道号改变的设备的UUID
- (void)didReceivePlayingChannelChange:(NSInteger)channel;

/// 收到设备广播的音量改变
/// @param volume 改变后的音量值
- (void)didReceiveVolumeChange:(float)volume;

@end

@interface MKRWIFIDeviceManager : NSObject

+ (instancetype)shareManager;

@property (nonatomic, strong)NSString *userID;

@property (nonatomic, strong) id<MKRUPnPDevice> device;

- (void)addDeviceManagerListener:(id<MKRWIFIDeviceManagerDelegate>)listener;

- (void)removeDeviceManagerListener:(id<MKRWIFIDeviceManagerDelegate>)listener;

/**
 * 初始化UPNP
 * @return UPNP初始化错误码 0为无错误 即初始化成功
 */
- (NSInteger)startUpnp;

/// 刷新upnp服务
- (void)reloadUpnp;

/// 停止upnp
- (void)stopUpnp;

/**
 * 搜索设备
 * @param searchTime 搜索时长
 * @param timeBlock  搜索回调 每秒在主线程回调一次
 */
- (void)searchDeviceWithSearchTime:(int)searchTime
                         timeBlock:(void(^)(NSInteger time))timeBlock;

/**
 * 生成m3u列表
 * @param m3uListModel m3u列表模型
 */
- (void)setM3UList:(MKRM3UListModel *)m3uListModel;

/**
 * 设置设备单首播放的资源
 * @param song 需要播放的资源
 * @param device 需要设置的设备
 */
- (void)setAVTransportURIWithSong:(id <MKRRadioResorce>)song
                           device:(id <MKRUPnPDevice>)device;

/**
 * 播放
 * @param device 设备
 */
- (void)playWithDevice:(id <MKRUPnPDevice>)device;

/**
 * 播放channelNO频道从第index开始
 * 在播放之前 如果是临时频道（频道号>= 13） 需要先生成M3U列表
 * 如是正式频道(频道号 1~12) 可选生成M3U
 * @param channelNO         频道号
 * @param firstPlayingSong  给当前播放下标需要播放资源给设备 设备会更快出声
 * @param index             需要播放的下标
 * @param device            播放的设备
 * @param timeStamp         频道时间戳
 */
- (void)playSongWithChannelNO:(NSInteger)channelNO
             firstPlayingSong:(id<MKRRadioResorce>)firstPlayingSong
                        index:(NSInteger)index
                       device:(id <MKRUPnPDevice>)device
                    timeStamp:(NSTimeInterval)timeStamp;
/**
 * 播放channelNO频道          从第0首开始
 * @param channelNO         频道号
 * @param firstPlayingSong  给当前播放下标需要播放资源给设备 设备会更快出声
 * @param device            需要播放的设备
 */
- (void)playSongWithChannelNO:(NSInteger)channelNO
             firstPlayingSong:(id<MKRRadioResorce>)firstPlayingSong
                       device:(id <MKRUPnPDevice>)device
                    timeStamp:(NSTimeInterval)timeStamp;

/**
* 播放临时频道频道(频道13)  从第index首开始
* @param index          需要播放的下标
* @param device         需要播放的设备
* @param timeStamp      频道时间戳
*/
- (void)playTempChannelSongs:(NSArray <id <MKRRadioResorce>> *)songs
                       index:(NSInteger)index
                      device:(id <MKRUPnPDevice>)device
                   timeStamp:(NSTimeInterval)timeStamp;

/**
* 播放临时频道频道(频道13)    从第index首开始
* @param device           需要播放的设备
* @param userID           用户ID
* @param timeStamp        频道时间戳
*/
- (void)playTempChannelSongs:(NSArray <id <MKRRadioResorce>> *)songs
                      device:(id <MKRUPnPDevice>)device
                   timeStamp:(NSTimeInterval)timeStamp;

/**
 * 暂停
 * @param device 设备
 */
- (void)pauseWithDevice:(id <MKRUPnPDevice>)device;

/**
 * 下一首
 * @param device 设备
 */
- (void)nextWithDevice:(id <MKRUPnPDevice>)device;

/**
 * 上一首
 * @param device 设备
 */
- (void)previousWithDevice:(id <MKRUPnPDevice>)device;

/**
 * 停止
 * @param device 设备
 */
- (void)stopWithDevice:(id <MKRUPnPDevice>)device;

/**
 * 设置音量
 * @param volume  音量值  1~100
 * @param device 设备
 */
- (void)setVolume:(int)volume device:(id <MKRUPnPDevice>)device;

/**
 * 快进到timeInterval 的进度
 * @param timeInterval 快进/快退目标秒数
 * @param device 需要快进的设备
 */
- (void)seekToTimeInterval:(NSInteger)timeInterval device:(id <MKRUPnPDevice>)device;

/**
 * 清空设备中的其中一个频道
 * @param channelNO 频道号
 * @param device 设备
 */
- (void)clearChannelWithChannelNO:(NSString *)channelNO device:(id <MKRUPnPDevice>)device;

- (id <MKRRadioResorce>)getPlayingStatusWithDevice:(id <MKRUPnPDevice>)device;

/// 通知设备刷新频道列表
/// 当channelFlag 为 @"ALL" 时 为更新12个频道
/// 当channelFlag 为 @"x(频道号)" 时 为更新x频道 eg:@"3"
/// 当channelFlag 为 @"audition_x(频道号)"时  为通知设备更新x频道 并且在更新后的频道中找到当前播放的歌曲续播 eg: @"audition_3"
/// @param channelFlag 频道标识
- (void)setChannelUpdate:(NSString *)channelFlag device:(id <MKRUPnPDevice>)device;

@end

