//
//  BMFMapView.m
//  flutter_bmfmap
//
//  Created by zbj on 2020/2/10.
//

#import "BMFMapView.h"
#import "BMFMapModels.h"
#import "BMFEdgeInsets.h"
@interface BMFMapView ()

/// map属性集合
@property (nonatomic, strong) NSDictionary *mapViewOptions;
@end

@implementation BMFMapView
+ (instancetype)viewWithFrame:(CGRect)frame {
    return [[BMFMapView alloc] initWithFrame:frame];
}
+ (instancetype)viewWithFrame:(CGRect)frame dic:(NSDictionary *)dic{
    BMFMapView *map = [[BMFMapView alloc] initWithFrame:frame];
    map.mapViewOptions = dic;
    [map updateMapViewWith:dic];
    return map;
}
// 此方法解决初始时设置的属性不生效问题
- (BOOL)updateMapOptions {
    if (_mapViewOptions) {
        // logo位置 默认BMKLogoPositionLeftBottom
        if ([_mapViewOptions[@"logoPosition"] isValidParam]) {
            self.logoPosition = [_mapViewOptions[@"logoPosition"] intValue];
        }
        // 指南针的位置，设定坐标以BMKMapView左上角为原点，向右向下增长
        if ([_mapViewOptions[@"compassPosition"] isValidParam]) {
            BMFMapPoint *point = [BMFMapPoint bmf_modelWith:_mapViewOptions[@"compassPosition"]];
            self.compassPosition = [point toCGPoint];
        }
        // 设定地图是否打开百度城市热力图图层（百度自有数据）
        if ([_mapViewOptions[@"baiduHeatMapEnabled"] isValidParam]) {
            self.baiduHeatMapEnabled = [_mapViewOptions[@"baiduHeatMapEnabled"] boolValue];
        }
        // 设定是否显式比例尺
        if ([_mapViewOptions[@"showMapScaleBar"] isValidParam]) {
            self.showMapScaleBar = [_mapViewOptions[@"showMapScaleBar"] boolValue];
        }
        // 比例尺的位置，设定坐标以BMKMapView左上角为原点，向右向下增长
        if ([_mapViewOptions[@"mapScaleBarPosition"] isValidParam]) {
            self.mapScaleBarPosition = [[BMFMapPoint bmf_modelWith:_mapViewOptions[@"mapScaleBarPosition"]]  toCGPoint];
        }
        return YES;
    }
    return NO;
}
- (BOOL)updateMapViewWith:(NSDictionary *)dic {
    BOOL result = NO;
    if (dic) {
        // 当前地图类型，可设定为标准地图、卫星地图
        if ([dic[@"mapType"] isValidParam]) {
            self.mapType = [dic[@"mapType"] intValue];
        }
       // 限制地图的显示范围（地图状态改变时，该范围不会在地图显示范围外。设置成功后，会调整地图显示该范围）
        if ([dic[@"limitMapBounds"] isValidParam]) {
            BMFCoordinateBounds *limitMapBounds = [BMFCoordinateBounds bmf_modelWith:dic[@"limitMapBounds"]];
            self.limitMapRegion = [limitMapBounds toCoordinateRegion];
        }
        // logo位置 默认BMKLogoPositionLeftBottom
        if ([_mapViewOptions[@"logoPosition"] isValidParam]) {
            self.logoPosition = [dic[@"logoPosition"] intValue];
        }
        // 指南针的位置，设定坐标以BMKMapView左上角为原点，向右向下增长
        if ([dic[@"compassPosition"] isValidParam]) {
            BMFMapPoint *point = [BMFMapPoint bmf_modelWith:dic[@"compassPosition"]];
            self.compassPosition = [point toCGPoint];
        }
        // 当前地图的中心点，改变该值时，地图的比例尺级别不会发生变化
        if ([dic[@"center"] isValidParam]) {
            BMFCoordinate *coord = [BMFCoordinate bmf_modelWith:dic[@"center"]];
            [self setCenterCoordinate:[coord toCLLocationCoordinate2D]];
        }
        // 地图比例尺级别，在手机上当前可使用的级别为4-21级
        if ([dic[@"zoomLevel"] isValidParam]) {
            self.zoomLevel = [dic[@"zoomLevel"] intValue];
        }
        // 地图的自定义最大比例尺级别
        if ([dic[@"minZoomLevel"] isValidParam]) {
            self.minZoomLevel = [dic[@"minZoomLevel"] intValue];
        }
        // 地图的自定义最大比例尺级别
        if ([dic[@"maxZoomLevel"] isValidParam]) {
            self.maxZoomLevel = [dic[@"maxZoomLevel"] intValue];
        }
        // 地图旋转角度，在手机上当前可使用的范围为－180～180度
        if ([dic[@"rotation"] isValidParam]) {
            self.rotation = [dic[@"rotation"] intValue];
        }
        // 地图俯视角度，在手机上当前可使用的范围为－45～0度
        if ([dic[@"overlooking"] isValidParam]) {
            self.overlooking = [dic[@"overlooking"] intValue];
        }
        // 地图俯视角度最小值（即角度最大值），在手机上当前可设置的范围为-79～0度
        if ([dic[@"minOverlooking"] isValidParam]) {
            self.minOverlooking = [dic[@"minOverlooking"] intValue];
        }
        // 设定地图是否现显示3D楼块效果
        if ([dic[@"buildingsEnabled"] isValidParam]) {
            self.buildingsEnabled = [dic[@"buildingsEnabled"] boolValue];
            [self setMapStatus:[self getMapStatus]];
        }
        // 设定地图是否显示底图poi标注(不包含室内图标注)，默认YES
        if ([dic[@"showMapPoi"] isValidParam]) {
            self.showMapPoi = [dic[@"showMapPoi"] boolValue];
        }
        // 设定地图是否打开路况图层
        if ([dic[@"trafficEnabled"] isValidParam]) {
            self.trafficEnabled = [dic[@"trafficEnabled"] boolValue];
        }
        // 设定地图是否打开百度城市热力图图层（百度自有数据）
        if ([dic[@"baiduHeatMapEnabled"] isValidParam]) {
            self.baiduHeatMapEnabled = [dic[@"baiduHeatMapEnabled"] boolValue];
        }
        // 设定地图View能否支持所有手势操作
        if ([dic[@"gesturesEnabled"] isValidParam]) {
            self.gesturesEnabled = [dic[@"gesturesEnabled"] boolValue];
        }
        // 设定地图View能否支持用户多点缩放(双指)
        if ([dic[@"zoomEnabled"] isValidParam]) {
            self.zoomEnabled = [dic[@"zoomEnabled"] boolValue];
        }
        // 设定地图View能否支持用户缩放(双击或双指单击)
        if ([dic[@"zoomEnabledWithTap"] isValidParam]) {
            self.zoomEnabledWithTap = [dic[@"zoomEnabledWithTap"] boolValue];
        }
        // 设定地图View能否支持用户移动地图
        if ([dic[@"scrollEnabled"] isValidParam]) {
            self.scrollEnabled = [dic[@"scrollEnabled"] boolValue];
        }
        // 设定地图View能否支持俯仰角
        if ([dic[@"overlookEnabled"] isValidParam]) {
            self.overlookEnabled = [dic[@"overlookEnabled"] boolValue];
        }
        // 设定地图View能否支持旋转
        if ([dic[@"rotateEnabled"] isValidParam]) {
            self.rotateEnabled = [dic[@"rotateEnabled"] boolValue];
        }
        // 设定地图是否回调force touch事件，默认为NO，仅适用于支持3D Touch的情况，
        // 开启后会回调 - mapview:onForceTouch:force:maximumPossibleForce:
        if ([dic[@"forceTouchEnabled"] isValidParam]) {
            self.forceTouchEnabled = [dic[@"forceTouchEnabled"] boolValue];
        }
        // 设定是否显式比例尺
        if ([dic[@"showMapScaleBar"] isValidParam]) {
            self.showMapScaleBar = [dic[@"showMapScaleBar"] boolValue];
        }
        // 比例尺的位置，设定坐标以BMKMapView左上角为原点，向右向下增长
        if ([dic[@"mapScaleBarPosition"] isValidParam]) {
            self.mapScaleBarPosition = [[BMFMapPoint bmf_modelWith:dic[@"mapScaleBarPosition"]]  toCGPoint];
        }

        // 当前地图范围，采用直角坐标系表示，向右向下增长
        if ([dic[@"visibleMapBounds"] isValidParam]) {
            BMFCoordinateBounds *visibleMapBounds = [BMFCoordinateBounds bmf_modelWith:dic[@"visibleMapBounds"]];
            [self setVisibleMapRect:[visibleMapBounds toBMKMapRect] animated:YES];
        }
        // 地图预留边界
        if ([dic[@"mapPadding"] isValidParam]) {
            BMFEdgeInsets *edge = [BMFEdgeInsets bmf_modelWith:dic[@"mapPadding"]];
            self.mapPadding = [edge toUIEdgeInsets];
        }
        // 设置mapPadding时，地图中心(屏幕坐标：BMKMapStatus.targetScreenPt)是否跟着改变，默认YES
        if ([dic[@"updateTargetScreenPtWhenMapPaddingChanged"] isValidParam]) {
            self.updateTargetScreenPtWhenMapPaddingChanged = [dic[@"updateTargetScreenPtWhenMapPaddingChanged"] boolValue];
        }
        // 设定双指手势操作时，BMKMapView的旋转和缩放效果的中心点。
        // 设置为YES时，以手势的中心点（二个指头的中心点）为中心进行旋转和缩放，地图中心点会改变；
        // 设置为NO时，以当前地图的中心点为中心进行旋转和缩放，地图中心点不变；
        // 默认值为NO。
        if ([dic[@"changeWithTouchPointCenterEnabled"] isValidParam]) {
            self.ChangeWithTouchPointCenterEnabled = [dic[@"changeWithTouchPointCenterEnabled"] boolValue];
        }
        // 设定双击手势放大地图时，BMKMapView的放大效果的中心点。
        //  设置为YES时，以双击的位置为中心点进行放大，地图中心点会改变；
        // 设置为NO时，以当前地图的中心点为中心进行放大，地图中心点不变；
        // 默认值为YES。
        if ([dic[@"changeCenterWithDoubleTouchPointEnabled"] isValidParam]) {
            self.ChangeCenterWithDoubleTouchPointEnabled = [dic[@"changeCenterWithDoubleTouchPointEnabled"] boolValue];
        }
        //  设定地图是否显示室内图
        if ([dic[@"baseIndoorMapEnabled"] isValidParam]) {
            self.baseIndoorMapEnabled = [dic[@"baseIndoorMapEnabled"] boolValue];
        }
        // 设定室内图标注是否显示，默认YES，仅当显示室内图（baseIndoorMapEnabled为YES）时生效
        if ([dic[@"showIndoorMapPoi"] isValidParam] && self.baseIndoorMapEnabled) {
            self.showIndoorMapPoi = [dic[@"showIndoorMapPoi"] boolValue];
        }
        result = YES;
    }
    return result;
}

- (void)dealloc {
    _mapViewOptions = nil;
//    NSLog(@"-mapView-dealloc");
}
@end
