//
//  BMKPOISearchOption.h
//  SearchComponent
//
//  本文件中包含了5种POI检索对应的请求参数信息类，以及其中用到的参数类、枚举等。
//  请求参数信息类的命名规则统一为 BMKPOIXXXSearchOption
//
//  Created by Baidu on 2018/5/8.
//  Copyright © 2018年 Baidu. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "BMKPoiSearchType.h"
#import <BaiduMapAPI_Base/BMKTypes.h>


#pragma mark - 枚举类型
/**
 检索过滤条件中的POI的行业类型
 
 - BMK_POI_INDUSTRY_TYPE_HOTEL: 宾馆
 - BMK_POI_INDUSTRY_TYPE_CATER: 餐饮
 - BMK_POI_INDUSTRY_TYPE_LIFE: 生活娱乐
 */
typedef NS_ENUM(NSUInteger, BMKPOIIndustryType) {
    BMK_POI_INDUSTRY_TYPE_HOTEL = 1,
    BMK_POI_INDUSTRY_TYPE_CATER,
    BMK_POI_INDUSTRY_TYPE_LIFE,
};

/**
 检索过滤条件中的排序依据类型
 类型整体分为宾馆行业、餐饮行业、生活娱乐行业3大类
 
 - BMK_POI_SORTNAME_TYPE_HOTEL_DEFAULT: 宾馆行业，默认排序
 - BMK_POI_SORTNAME_TYPE_HOTEL_PRICE: 宾馆行业，按价格排序
 - BMK_POI_SORTNAME_TYPE_HOTEL_DISTANCE: 宾馆行业，按距离排序（只对周边检索有效）
 - BMK_POI_SORTNAME_TYPE_HOTEL_TOTAL_SCORE: 宾馆行业，按好评排序
 - BMK_POI_SORTNAME_TYPE_HOTEL_LEVEL: 宾馆行业，按星级排序
 - BMK_POI_SORTNAME_TYPE_HOTEL_HEALTH_SCORE: 宾馆行业，按卫生排序
 - BMK_POI_SORTNAME_TYPE_CATER_DEFAULT: 餐饮行业，默认排序
 - BMK_POI_SORTNAME_TYPE_CATER_PRICE: 餐饮行业，按价格排序
 - BMK_POI_SORTNAME_TYPE_CATER_DISTANCE: 餐饮行业，按距离排序（只对周边检索有效）
 - BMK_POI_SORTNAME_TYPE_CATER_TASTE_RATING: 餐饮行业，按口味排序
 - BMK_POI_SORTNAME_TYPE_CATER_OVERALL_RATING: 餐饮行业，按好评排序
 - BMK_POI_SORTNAME_TYPE_CATER_SERVICE_RATING: 餐饮行业，按服务排序
 - BMK_POI_SORTNAME_TYPE_LIFE_DEFAULT: 生活娱乐行业，默认排序
 - BMK_POI_SORTNAME_TYPE_LIFE_PRICE: 生活娱乐行业，按价格排序
 - BMK_POI_SORTNAME_TYPE_LIFE_DISTANCE: 生活娱乐行业，按距离排序（只对周边检索有效）
 - BMK_POI_SORTNAME_TYPE_LIFE_OVERALL_RATING: 生活娱乐行业，按好评排序
 - BMK_POI_SORTNAME_TYPE_LIFE_COMMENT_NUMBER: 生活娱乐行业，按服务排序
 */
typedef NS_ENUM(NSUInteger, BMKPOISortBasisType) {
    BMK_POI_SORT_BASIS_TYPE_HOTEL_DEFAULT = 1,
    BMK_POI_SORT_BASIS_TYPE_HOTEL_PRICE,
    BMK_POI_SORT_BASIS_TYPE_HOTEL_DISTANCE,
    BMK_POI_SORT_BASIS_TYPE_HOTEL_TOTAL_SCORE,
    BMK_POI_SORT_BASIS_TYPE_HOTEL_LEVEL,
    BMK_POI_SORT_BASIS_TYPE_HOTEL_HEALTH_SCORE,
    
    BMK_POI_SORT_BASIS_TYPE_CATER_DEFAULT = 10,
    BMK_POI_SORT_BASIS_TYPE_CATER_PRICE,
    BMK_POI_SORT_BASIS_TYPE_CATER_DISTANCE,
    BMK_POI_SORT_BASIS_TYPE_CATER_TASTE_RATING,
    BMK_POI_SORT_BASIS_TYPE_CATER_OVERALL_RATING,
    BMK_POI_SORT_BASIS_TYPE_CATER_SERVICE_RATING,
    
    BMK_POI_SORT_BASIS_TYPE_LIFE_DEFAULT = 20,
    BMK_POI_SORT_BASIS_TYPE_LIFE_PRICE,
    BMK_POI_SORT_BASIS_TYPE_LIFE_DISTANCE,
    BMK_POI_SORT_BASIS_TYPE_LIFE_OVERALL_RATING,
    BMK_POI_SORT_BASIS_TYPE_LIFE_COMMENT_NUMBER,
};

/**
 POI检索排序规则
 
 - BMK_POI_SORT_RULE_DESCENDING: 从高到底，降序排列
 - BMK_POI_SORT_RULE_ASCENDING: 从低到高，升序排列
 */
typedef NS_ENUM(NSUInteger, BMKPOISortRuleType) {
    BMK_POI_SORT_RULE_DESCENDING = 0,
    BMK_POI_SORT_RULE_ASCENDING,
};

/**
 POI检索结果详细程度
 
 - BMK_POI_SCOPE_BASIC_INFORMATION: 基本信息
 - BMK_POI_SCOPE_DETAIL_INFORMATION: 详细信息
 */
typedef NS_ENUM(NSUInteger, BMKPOISearchScopeType) {
    BMK_POI_SCOPE_BASIC_INFORMATION = 1,
    BMK_POI_SCOPE_DETAIL_INFORMATION,
};


#pragma mark - POI检索过滤条件类
@interface BMKPOISearchFilter : NSObject
/// POI所属行业类型，设置该字段可提高检索速度和过滤经度
@property (nonatomic, assign) BMKPOIIndustryType industryType;
/**
 排序依据，根据industryType字段指定的行业类型不同，此字段应设置为对应行业的依据值
 比如industryType字段的值为BMK_POI_INDUSTRY_TYPE_CATER，则此字段应选择BMK_POI_SORT_BASIS_TYPE_CATER_XXX对应的枚举值
 */
@property (nonatomic, assign) BMKPOISortBasisType sortBasis;
/// 排序规则
@property (nonatomic, assign) BMKPOISortRuleType sortRule;
/// 是否有团购
@property (nonatomic, assign) BOOL isGroupon;
/// 是否有打折
@property (nonatomic, assign) BOOL isDiscount;
@end


#pragma mark - POI城市检索参数信息类
/// POI城市检索参数信息类
@interface BMKPOICitySearchOption : NSObject
/// 检索关键字，必选。举例：天安门
@property (nonatomic, copy) NSString *keyword;
/// 检索分类，与keyword字段组合进行检索，多个分类以","分隔。举例：美食,酒店
@property (nonatomic, copy) NSArray<NSString *> *tags;
/// 区域名称(市或区的名字，如北京市，海淀区)或区域编码，必选
@property (nonatomic, copy) NSString *city;
/// 区域数据返回限制，可选，为true时，仅返回city对应区域内数据
@property (nonatomic, assign) BOOL isCityLimit;
//// 检索结果详细程度 默认为BMK_POI_SCOPE_BASIC_INFORMATION
@property (nonatomic, assign) BMKPOISearchScopeType scope;
/// 检索过滤条件。scope字段为BMK_POI_SCOPE_DETAIL_INFORMATION时，filter字段才有效
@property (nonatomic, strong) BMKPOISearchFilter *filter;
/// 分页页码，默认为0,0代表第一页，1代表第二页，以此类推
@property (nonatomic, assign) NSInteger pageIndex;
/// 单次召回POI数量，默认为10条记录，最大返回20条。
@property (nonatomic, assign) NSInteger pageSize;
/// 可选。语言类型，默认中文。
@property (nonatomic, assign) BMKLanguageType languageType;
@end


#pragma mark - POI周边检索参数信息类
/// POI周边检索参数信息类
@interface BMKPOINearbySearchOption : NSObject
/**
 检索关键字，必选。
 在周边检索中关键字为数组类型，可以支持多个关键字并集检索，如银行和酒店。每个关键字对应数组一个元素。
 最多支持10个关键字。
 */
@property (nonatomic, copy) NSArray<NSString *> *keywords;
/**
 检索分类，可选。
 该字段与keywords字段组合进行检索。
 支持多个分类，如美食和酒店。每个分类对应数组中一个元素
 */
@property (nonatomic, copy) NSArray<NSString *> *tags;
/// 检索中心点的经纬度，必选
@property (nonatomic, assign) CLLocationCoordinate2D location;
/**
 检索半径，可选，单位是米。
 当半径过大，超过中心点所在城市边界时，会变为城市范围检索，检索范围为中心点所在城市
 */
@property (nonatomic, assign) NSInteger radius;
/**
 是否严格限定召回结果在设置检索半径范围内。默认值为false。
 值为true代表检索结果严格限定在半径范围内；值为false时不严格限定。
 注意：值为true时会影响返回结果中total准确性及每页召回poi数量，我们会逐步解决此类问题。
 */
@property (nonatomic, assign) BOOL isRadiusLimit;
/// 检索结果详细程度 默认为BMK_POI_SCOPE_BASIC_INFORMATION
@property (nonatomic, assign) BMKPOISearchScopeType scope;
/// 检索过滤条件。scope字段为BMK_POI_SCOPE_DETAIL_INFORMATION时，filter字段才有效
@property (nonatomic, strong) BMKPOISearchFilter *filter;
/// 分页页码，默认为0,0代表第一页，1代表第二页，以此类推
@property (nonatomic, assign) NSInteger pageIndex;
/// 单次召回POI数量，默认为10条记录，最大返回20条。
@property (nonatomic, assign) NSInteger pageSize;
/// 可选。语言类型，默认中文。
@property (nonatomic, assign) BMKLanguageType languageType;
@end


#pragma mark - POI矩形区域检索参数信息类
/// POI矩形区域检索参数信息类
@interface BMKPOIBoundSearchOption : NSObject
/**
 检索关键字，必选。
 在矩形检索中关键字为数组类型，可以支持多个关键字并集检索，如银行和酒店。每个关键字对应数组一个元素。
 最多支持10个关键字。
 */
@property (nonatomic, copy) NSArray<NSString *> *keywords;
/**
 检索分类，可选。
 该字段与keywords字段组合进行检索。
 支持多个分类，如美食和酒店。每个分类对应数组中一个元素
 */
@property (nonatomic, copy) NSArray<NSString *> *tags;
/// 矩形检索区域的左下角经纬度坐标，必选
@property (nonatomic, assign) CLLocationCoordinate2D leftBottom;
/// 矩形检索区域的右上角经纬度坐标，必选
@property (nonatomic, assign) CLLocationCoordinate2D rightTop;
/// 检索结果详细程度 默认为BMK_POI_SCOPE_BASIC_INFORMATION
@property (nonatomic, assign) BMKPOISearchScopeType scope;
/// 检索过滤条件。scope字段为BMK_POI_SCOPE_DETAIL_INFORMATION时，filter字段才有效
@property (nonatomic, strong) BMKPOISearchFilter *filter;
/// 分页页码，默认为0,0代表第一页，1代表第二页，以此类推
@property (nonatomic, assign) NSInteger pageIndex;
/// 单次召回POI数量，默认为10条记录，最大返回20条。
@property (nonatomic, assign) NSInteger pageSize;
/// 可选。语言类型，默认中文。
@property (nonatomic, assign) BMKLanguageType languageType;
@end


#pragma mark - POI详情检索参数信息类
/// POI详情检索信息类
@interface BMKPOIDetailSearchOption : NSObject
/// POI的唯一标识符集合，必选 注：从POI检索的返回结果BMKPoiInfo里获取。
@property (nonatomic, copy) NSArray<NSString *> *poiUIDs;
/// 检索结果详细程度
@property (nonatomic, assign) BMKPOISearchScopeType scope;
@end


#pragma mark - POI室内检索参数信息类
/// 室内POI检索参数信息类
@interface BMKPOIIndoorSearchOption : NSObject
/// 室内检索唯一标识符，必选 注：从进入/移出室内图的回调方法中获取。
@property (nonatomic, copy) NSString *indoorID;
/// 室内检索关键字，必选
@property (nonatomic, copy) NSString *keyword;
/// 楼层（可选），设置后，会优先获取该楼层的室内POI，然后是其它楼层的。如“F3”,"B3"等。
@property (nonatomic, copy) NSString *floor;
/// 分页页码，默认为0,0代表第一页，1代表第二页，以此类推
@property (nonatomic, assign) NSInteger pageIndex;
/// 单次召回POI数量，默认为10条记录，最大返回20条。
@property (nonatomic, assign) NSInteger pageSize;
@end
