//
//  BRStringPickerView.h
//  BRPickerViewDemo
//
//  Created by renbo on 2017/8/11.
//  Copyright © 2017 irenb. All rights reserved.
//
//  最新代码下载地址：https://github.com/agiapp/BRPickerView

#import "BRBaseView.h"
#import "BRResultModel.h"

NS_ASSUME_NONNULL_BEGIN

/// 字符串选择器类型
typedef NS_ENUM(NSInteger, BRStringPickerMode) {
    /** 单列选择器 */
    BRStringPickerComponentSingle,
    /** 多列选择器 */
    BRStringPickerComponentMulti,
    /** 多级联动选择器 */
    BRStringPickerComponentLinkage
};

typedef void(^BRStringResultModelBlock)(BRResultModel * _Nullable resultModel);

typedef void(^BRStringResultModelArrayBlock)(NSArray <BRResultModel *> * _Nullable resultModelArr);

// BRStringPickerView 组件已废弃，请使用 BRTextPickerView 组件进行替换，具体使用请参见 README.md
//__attribute__((deprecated("Use 'BRTextPickerView' instead.")))
@interface BRStringPickerView : BRBaseView

/**
 //////////////////////////////////////////////////////////////////////////
 ///
 ///   【用法一】
 ///    特点：灵活，扩展性强（推荐使用！）
 ///
 ////////////////////////////////////////////////////////////////////////*/

/** 字符串选择器显示类型 */
@property (nonatomic, assign) BRStringPickerMode pickerMode;

/**
 *  1.设置数据源
 *    单列：@[@"男", @"女", @"其他"]，或直接传一维模型数组(NSArray <BRResultModel *>*)
 *    多列：@[@[@"语文", @"数学", @"英语"], @[@"优秀", @"良好"]]，或直接传多维模型数组
 *    联动：直接传一维模型数组(NSArray <BRResultModel *>*)，要注意数据源联动格式，可参考Demo
 */
@property (nullable, nonatomic, copy) NSArray *dataSourceArr;
/**
 *  2.设置数据源
 *    直接传plist文件名：NSString类型（如：@"test.plist"），要带后缀名
 *    场景：可以将数据源数据（数组类型）放到plist文件中，直接传plist文件名更加简单
 */
@property (nullable, nonatomic, copy) NSString *plistName;

/**
 *  设置默认选中的位置【单列】
 *  推荐使用 selectIndex，更加严谨，可以避免使用 selectValue 时，有名称相同的情况
 */
@property (nonatomic, assign) NSInteger selectIndex;
@property (nullable, nonatomic, copy) NSString *selectValue;

/**
 *  设置默认选中的位置【多列】
 *  推荐使用 selectIndexs，更加严谨，可以避免使用 selectValues 时，有名称相同的情况
 */
@property (nullable, nonatomic, copy) NSArray <NSNumber *> *selectIndexs;
@property (nullable, nonatomic, copy) NSArray <NSString *> *selectValues;

/** 选择结果的回调【单列】 */
@property (nullable, nonatomic, copy) BRStringResultModelBlock resultModelBlock;
/** 选择结果的回调【多列】 */
@property (nullable, nonatomic, copy) BRStringResultModelArrayBlock resultModelArrayBlock;

/** 滚动选择时触发的回调【单列】 */
@property (nullable, nonatomic, copy) BRStringResultModelBlock changeModelBlock;
/** 滚动选择时触发的回调【多列】 */
@property (nullable, nonatomic, copy) BRStringResultModelArrayBlock changeModelArrayBlock;

/** 判断选择器是否处于滚动中。可以用于解决快速滑动选择器，在滚动结束前秒选确定按钮，出现显示不对的问题。*/
@property (nonatomic, readonly, assign, getter=isRolling) BOOL rolling;

/**
 *  最大层级数(列数) for `BRStringPickerComponentLinkage`, ignored otherwise.
 *  使用场景：默认可选，当数据源中有 key 等于 parentKey 情况时，必须要设置
 */
@property (nonatomic, assign) NSInteger numberOfComponents;

/** 滚动至选择行动画，默认为 NO */
@property (nonatomic, assign) BOOL selectRowAnimated;

/// 初始化字符串选择器
/// @param pickerMode 字符串选择器显示类型
- (instancetype)initWithPickerMode:(BRStringPickerMode)pickerMode;

/// 弹出选择器视图
- (void)show;

/// 关闭选择器视图
- (void)dismiss;




//================================================= 华丽的分割线 =================================================




/**
 //////////////////////////////////////////////////////////////////////////
 ///
 ///   【用法二】：快捷使用，直接选择下面其中的一个方法进行使用
 ///    特点：快捷，方便
 ///
 ////////////////////////////////////////////////////////////////////////*/

/**
 *  1.显示【单列】选择器
 *
 *  @param title               选择器标题
 *  @param dataSourceArr       数据源，格式：@[@"男", @"女", @"其他"]，或直接传一维模型数组(NSArray <BRResultModel *>*)
 *  @param selectIndex         默认选中的位置
 *  @param resultBlock         选择后的回调
 *
 */
+ (void)showPickerWithTitle:(nullable NSString *)title
              dataSourceArr:(nullable NSArray *)dataSourceArr
                selectIndex:(NSInteger)selectIndex
                resultBlock:(nullable BRStringResultModelBlock)resultBlock;

/**
 *  2.显示【单列】选择器
 *
 *  @param title               选择器标题
 *  @param dataSourceArr       数据源（如：@[@"男", @"女", @"其他"]，或直接传模型数组）
 *  @param selectIndex         默认选中的位置
 *  @param isAutoSelect        是否自动选择，即滚动选择器后就执行结果回调，默认为 NO
 *  @param resultBlock         选择后的回调
 *
 */
+ (void)showPickerWithTitle:(nullable NSString *)title
              dataSourceArr:(nullable NSArray *)dataSourceArr
                selectIndex:(NSInteger)selectIndex
               isAutoSelect:(BOOL)isAutoSelect
                resultBlock:(nullable BRStringResultModelBlock)resultBlock;

/**
 *  3.显示【多列】选择器
 *
 *  @param title               选择器标题
 *  @param dataSourceArr       数据源，格式：@[@[@"语文", @"数学", @"英语"], @[@"优秀", @"良好"]]，或直接传多维模型数组
 *  @param selectIndexs        默认选中的位置（传索引数组，如：@[@2, @1]）
 *  @param resultBlock         选择后的回调
 *
 */
+ (void)showMultiPickerWithTitle:(nullable NSString *)title
                   dataSourceArr:(nullable NSArray *)dataSourceArr
                    selectIndexs:(nullable NSArray <NSNumber *> *)selectIndexs
                     resultBlock:(nullable BRStringResultModelArrayBlock)resultBlock;

/**
 *  4.显示【多列】选择器
 *
 *  @param title               选择器标题
 *  @param dataSourceArr       数据源，格式：@[@[@"语文", @"数学", @"英语"], @[@"优秀", @"良好"]]，或直接传多维模型数组
 *  @param selectIndexs        默认选中的位置（传索引数组，如：@[@2, @1]）
 *  @param isAutoSelect        是否自动选择，即滚动选择器后就执行结果回调，默认为 NO
 *  @param resultBlock         选择后的回调
 *
 */
+ (void)showMultiPickerWithTitle:(nullable NSString *)title
                   dataSourceArr:(nullable NSArray *)dataSourceArr
                    selectIndexs:(nullable NSArray <NSNumber *> *)selectIndexs
                    isAutoSelect:(BOOL)isAutoSelect
                     resultBlock:(nullable BRStringResultModelArrayBlock)resultBlock;

/**
 *  5.显示【联动】选择器
 *
 *  @param title               选择器标题
 *  @param dataSourceArr       数据源，格式：直接传一维模型数组(NSArray <BRResultModel *>*)
 *  @param selectIndexs        默认选中的位置（传索引数组，如：@[@2, @1]）
 *  @param isAutoSelect        是否自动选择，即滚动选择器后就执行结果回调，默认为 NO
 *  @param resultBlock         选择后的回调
 *
 */
+ (void)showLinkagePickerWithTitle:(nullable NSString *)title
                     dataSourceArr:(nullable NSArray *)dataSourceArr
                      selectIndexs:(nullable NSArray <NSNumber *> *)selectIndexs
                      isAutoSelect:(BOOL)isAutoSelect
                       resultBlock:(nullable BRStringResultModelArrayBlock)resultBlock;


@end

NS_ASSUME_NONNULL_END
