import { ComponentType } from 'react'
import { StandardProps, CommonEventFunction } from './common'
interface MapProps extends StandardProps {
  /** 中心经度
   * @supported weapp, alipay, swan, tt, qq, jd
   */
  longitude: number
  /** 中心纬度
   * @supported weapp, alipay, swan, tt, qq, jd
   */
  latitude: number
  /** 缩放级别，取值范围为 3-20
   * @default 16
   * @supported weapp, alipay, swan, tt, qq, jd
   * @swan 取值范围为4-21
   * @alipay 取值范围为5-18
   */
  scale?: number
  /** 最小缩放级别 3-20
   * @default 3
   * @supported weapp, tt
   */
  minScale?: number
  /** 最大缩放级别 3-20
   * @default 20
   * @supported weapp, tt
   */
  maxScale?: number
  /** 标记点
   * @supported weapp, alipay, swan, tt, qq, jd
   */
  markers?: MapProps.marker[]
  /** **即将移除，请使用 markers**
   * @supported weapp
   * @deprecated
   */
  covers?: any[]
  /** 路线
   * @supported weapp, alipay, swan, tt, qq, jd
   */
  polyline?: MapProps.polyline[]
  /** 圆
   * @supported weapp, alipay, swan, tt, qq, jd
   */
  circles?: MapProps.circle[]
  /** 控件（即将废弃，建议使用 cover-view 代替）
   * @deprecated
   * @supported weapp, alipay, swan, jd
   */
  controls?: MapProps.control[]
  /** 缩放视野以包含所有给定的坐标点
   * @supported weapp, alipay, swan, tt, qq, jd
   */
  includePoints?: MapProps.point[]
  /** 显示带有方向的当前定位点
   * @default false
   * @supported weapp, alipay, swan, tt, qq, jd
   */
  showLocation?: boolean
  /** 多边形
   * @supported weapp, swan, tt, qq
   */
  polygons?: MapProps.polygon[]
  /** 个性化地图使用的 key
   * @supported weapp, qq
   */
  subkey?: string
  /** 个性化地图配置的 style，不支持动态修改
   * @default 1
   * @supported weapp, qq
   */
  layerStyle?: number
  /** 旋转角度，范围 0 ~ 360, 地图正北和设备 y 轴角度的夹角
   * @default 0
   * @supported weapp, alipay, tt, qq
   */
  rotate?: number
  /** 倾斜角度，范围 0 ~ 40 , 关于 z 轴的倾角
   * @default 0
   * @supported weapp, alipay, tt, qq
   */
  skew?: number
  /** 显示指南针
   * @default false
   * @supported weapp, alipay, swan, tt, qq
   */
  showCompass?: boolean
  /** 显示比例尺
   * @default false
   * @supported weapp, alipay, tt, qq
   */
  showScale?: boolean
  /** 开启俯视
   * @default false
   * @supported weapp, alipay, swan, tt, qq
   */
  enableOverlooking?: boolean
  /** 是否支持缩放
   * @default true
   * @supported weapp, alipay, swan, tt, qq
   */
  enableZoom?: boolean
  /** 是否支持拖动
   * @default true
   * @supported weapp, alipay, swan, tt, qq
   */
  enableScroll?: boolean
  /** 是否支持旋转
   * @default false
   * @supported weapp, alipay, swan, tt, qq
   */
  enableRotate?: boolean
  /** 是否开启卫星图
   * @default false
   * @supported weapp, alipay, tt, qq
   */
  enableSatellite?: boolean
  /** 是否开启实时路况
   * @default false
   * @supported weapp, alipay, tt, qq
   */
  enableTraffic?: boolean
  /** 配置项
   *
   * 提供 setting 对象统一设置地图配置。同时对于一些动画属性如 rotate 和 skew，通过 setData 分开设置时无法同时生效，需通过 settting 统一修改。
   * @supported weapp, alipay, qq
   */
  setting?:
    | MapProps
    | {
        [key: string]: number | string | any
      }
  /** 视野在地图 padding 范围内展示
   * @supported alipay
   */
  includePadding?: { [key in 'left' | 'right' | 'top' | 'bottom']: number | string }
  /** 覆盖物，自定义贴图
   * @supported alipay
   */
  groundOverlays?: MapProps.groundOverlays[]
  /** 覆盖物，网格贴图
   * @supported alipay
   */
  tileOverlay?: MapProps.tileOverlay
  /** 是否展示 POI 点
   * @supported weapp, alipay, tt
   * @default true
   */
  enablePoi?: boolean
  /** 是否展示建筑物
   * @supported weapp, alipay, tt
   * @default true
   */
  enableBuilding?: boolean
  /** 覆盖物，多边形。
   * @supported alipay
   */
  polygon?: MapProps.polygon[]
  /** 设置地图样式。
   *
   * default：默认样式
   * light：精简样式
   * @supported alipay
   */
  customMapStyle?: string
  /** 基于 map 高级定制渲染，设置覆盖在地图上的 view。
   * @supported alipay
   */
  panels?: MapProps.panels[]
  /** 否
   * @supported jd
   */
  theme?: string
  /** 保持缩放比例不变
   * @supported alipay
   * @default false
   */
  optimize?: boolean
  /** 开启最大俯视角，俯视角度从 45 度拓展到 75 度
   * @supported weapp
   * @default false
   */
  enableAutoMaxOverlooking?: boolean
  /** 展示3D楼块
   * @supported weapp, swan, tt, qq
   * @default false
   */
  enable3D?: boolean
  /** 点击地图时触发
   * @supported weapp, alipay, swan, tt, qq, jd
   */
  onTap?: CommonEventFunction
  /** 点击标记点时触发，e.detail = {markerId}
   * @supported weapp, alipay, swan, tt, qq, jd
   */
  onMarkerTap?: CommonEventFunction<MapProps.onMarkerTapEventDetail>
  /** 点击label时触发，e.detail = {markerId}
   * @supported weapp, tt
   */
  onLabelTap?: CommonEventFunction<MapProps.onLabelTapEventDetail>
  /** 点击控件时触发，e.detail = {controlId}
   * @supported weapp, alipay, swan, jd
   */
  onControlTap?: CommonEventFunction<MapProps.onControlTapEventDetail>
  /** 点击标记点对应的气泡时触发，e.detail = {markerId}
   * @supported alipay
   */
  onCalloutTap?: CommonEventFunction<MapProps.onCalloutTapEventDetail>
  /** 在地图渲染更新完成时触发
   * @supported weapp, swan, tt, qq
   */
  onUpdated?: CommonEventFunction
  /** 视野发生变化时触发
   * @supported weapp, alipay, swan, tt, qq, jd
   */
  onRegionChange?: CommonEventFunction<MapProps.onRegionEventDetail<'begin'> | MapProps.onRegionEventDetail<'end'>>
  /** 点击地图poi点时触发，e.detail = {name, longitude, latitude}
   * @supported weapp, swan, qq
   */
  onPoiTap?: CommonEventFunction<MapProps.onPoiTapEventDetail>
  /** 点击地图路线时触发，e.detail = {longitude, latitude}
   * @supported weapp, swan, qq
   */
  onPolylineTap?: CommonEventFunction<MapProps.onPolylineTapEventDetail>
  /** 地图能力生效时触发，e.detail = {ability, errCode, errMsg}
   * @supported weapp
   */
  onAbilitySuccess?: CommonEventFunction<MapProps.onAbilityEventDetail>
  /** 地图能力失败时触发，e.detail = {ability, errCode, errMsg}
   * @supported weapp
   */
  onAbilityFailed?: CommonEventFunction<MapProps.onAbilityEventDetail>
  /** 地图鉴权结果成功时触发，e.detail = {errCode, errMsg}
   * @supported weapp
   */
  onAuthSuccess?: CommonEventFunction<{ errCode: number; errMsg: string }>
  /** MapContext.moveAlong 插值动画时触发。e.detail = {markerId, longitude, latitude, animationStatus: "interpolating" | "complete"}
   * @supported weapp
   */
  onInterpolatePoint?: CommonEventFunction<MapProps.onInterpolatePointEventDetail>
  /** 组件错误时触发，例如创建或鉴权失败，e.detail = {longitude, latitude}
   * @supported weapp
   */
  onError: CommonEventFunction<MapProps.point>
  /** 点击标记点对应的气泡时触发e.detail = {markerId}
   * @supported weapp, swan, tt, jd
   */
  onCallOutTap?: CommonEventFunction<MapProps.onCalloutTapEventDetail>
  /** 点击定位标时触发，e.detail = {longitude, latitude}
   * @supported weapp, tt
   */
  onAnchorPointTap?: CommonEventFunction<MapProps.point>
  /** 点击 panel 时触发。
   * @supported alipay
   */
  onPanelTap?: CommonEventFunction<{
    panelId
    layoutId
  }>
  /** 地图初始化完成即将开始渲染第一帧时触发。
   * @supported alipay
   */
  onInitComplete?: CommonEventFunction
}
declare namespace MapProps {
  /** 标记点用于在地图上显示标记的位置 */
  interface marker {
    /** 标记点id
     * @remarks marker 点击事件回调会返回此id。建议为每个 marker 设置上 Number 类型 id，保证更新 marker 时有更好的性能。
     */
    id?: number
    /** 纬度
     * @remarks 浮点数，范围 -90 ~ 90
     */
    latitude: number
    /** 经度
     * @remarks 浮点数，范围 -180 ~ 180
     */
    longitude: number
    /** 标注点名
     * @remarks 点击时显示，callout 存在时将被忽略
     */
    title?: string
    /** 显示层级
     */
    zIndex?: number
    /** 显示的图标
     * @remarks 项目目录下的图片路径，支持相对路径写法，以'/'开头则表示相对小程序根目录；也支持临时路径和网络图片
     */
    iconPath: string
    /** 旋转角度
     * @remarks 顺时针旋转的角度，范围 0 ~ 360，默认为 0
     */
    rotate?: number
    /** 标注的透明度
     * @remarks 默认1，无透明，范围 0 ~ 1
     */
    alpha?: number
    /** 标注图标宽度
     * @remarks 默认为图片实际宽度
     */
    width?: number | string
    /** 标注图标高度
     * @remarks 默认为图片实际高度
     */
    height?: number | string
    /** 标记点上方的气泡窗口
     * @remarks 支持的属性见下表，可识别换行符。
     */
    callout?: callout
    /** 自定义气泡窗口
     * @remarks 支持的属性见下表，可识别换行符。
     */
    customCallout?: customCallout
    /** 为标记点旁边增加标签
     * @remarks 支持的属性见下表
     */
    label?: label
    /** 经纬度在标注图标的锚点，默认底边中点
     * @remarks {x, y}，x表示横向(0-1)，y表示竖向(0-1)。{x: .5, y: 1} 表示底边中点
     */
    anchor?: {
      x: number
      y: number
    }
    /** 无障碍访问，（属性）元素的额外描述 */
    ariaLabel?: string
  }
  /** marker 上的气泡 callout */
  interface callout {
    /** 文本 */
    content: string
    /** 文本颜色 */
    color: string
    /** 文字大小 */
    fontSize: number
    /** 横向偏移量，向右为正数 */
    anchorX: number
    /** 纵向偏移量，向下为正数 */
    anchorY: number
    /** 边框圆角 */
    borderRadius: number
    /** 边框宽度 */
    borderWidth: number
    /** 边框颜色 */
    borderColor: string
    /** 背景色 */
    bgColor: string
    /** 文本边缘留白 */
    padding: number
    /** 'BYCLICK':点击显示; 'ALWAYS':常显 */
    display: 'BYCLICK' | 'ALWAYS'
    /** 文本对齐方式。有效值: left, right, center */
    textAlign: 'left' | 'right' | 'center'
  }
  /** marker 上的自定义气泡 customCallout
   *
   * `customCallout` 存在时将忽略 `callout` 与 `title` 属性。自定义气泡采用采用 `cover-view` 定制，灵活度更高。
   */
  interface customCallout {
    /** 'BYCLICK':点击显示; 'ALWAYS':常显 */
    display: 'BYCLICK' | 'ALWAYS' | string
    /** 横向偏移量，向右为正数 */
    anchorX: number
    /** 纵向偏移量，向下为正数 */
    anchorY: number
  }
  /** marker 上的气泡 label */
  interface label {
    /** 文本 */
    content: string
    /** 文本颜色 */
    color: string
    /** 文字大小 */
    fontSize: number
    /** label的坐标，原点是 marker 对应的经纬度 */
    anchorX: number
    /** label的坐标，原点是 marker 对应的经纬度 */
    anchorY: number
    /** 边框宽度 */
    borderWidth: number
    /** 边框颜色 */
    borderColor: string
    /** 边框圆角 */
    borderRadius: number
    /** 背景色 */
    bgColor: string
    /** 文本边缘留白 */
    padding: number
    /** 文本对齐方式。有效值: left, right, center */
    textAlign: 'left' | 'right' | 'center'
  }
  /** 指定一系列坐标点，从数组第一项连线至最后一项 */
  interface polyline {
    /** 经纬度数组
     * @remarks [{latitude: 0, longitude: 0}]
     */
    points: point[]
    /** 线的颜色
     * @remarks 十六进制
     */
    color?: string
    /** 线的宽度 */
    width?: number
    /** 是否虚线
     * @remarks 默认 false
     */
    dottedLine?: boolean
    /** 带箭头的线
     * @remarks 默认 false，开发者工具暂不支持该属性
     */
    arrowLine?: boolean
    /** 更换箭头图标
     * @remarks 在 arrowLine 为 true 时生效
     */
    arrowIconPath?: string
    /** 线的边框颜色 */
    borderColor?: string
    /** 线的厚度 */
    borderWidth?: number
  }
  /** 指定一系列坐标点，根据 points 坐标数据生成闭合多边形 */
  interface polygon {
    /**
     * 边线虚线
     * @remarks 默认值 [0, 0] 为实线，[10, 10]表示十个像素的实线和十个像素的空白（如此反复）组成的虚线
     * @default [0,0]
     * @supported weapp
     */
    dashArray?: number[]
    /** 经纬度数组
     * @remarks [{latitude: 0, longitude: 0}]
     */
    points: point[]
    /**
     * 线的颜色，用 8 位十六进制表示，后两位表示 alpha 值，如：#eeeeeeAA。
     * @remarks 当前 Android 与 iOS 上此属性默认值存在差异（分别为 transparent 与 #ff0000ff ），建议在代码中统一显式设置。
     * @supported alipay
     */
    color?: string
    /** 描边的宽度 */
    strokeWidth?: number
    /** 描边的颜色
     * @remarks 十六进制
     */
    strokeColor?: string
    /** 填充颜色
     * @remarks 十六进制
     */
    fillColor?: string
    /**
     * 线的宽度
     * @remarks 当前 Android 与 iOS 上此属性默认值存在差异（分别为 0 与 5），建议在代码中统一显式设置。
     * @supported alipay
     */
    width?: number
    /** 设置多边形Z轴数值 */
    zIndex?: number
    /**
     * 压盖关系
     * @supported weapp
     * @remarks 默认为 abovelabels
     */
    level?: string
    /**
     * 标明在特定地图缩放级别下展示。
     * @remarks [{ from: 12, to: 17}]
     * @supported alipay
     */
    displayRanges?: [
      {
        from: number
        to: number
      }
    ]
  }
  /** 在地图上显示圆 */
  interface circle {
    /** 纬度
     * @remarks 浮点数，范围 -90 ~ 90
     */
    latitude: number
    /** 经度
     * @remarks 浮点数，范围 -180 ~ 180
     */
    longitude?: number
    /** 描边的颜色
     * @remarks 十六进制
     */
    color?: string
    /** 填充颜色
     * @remarks 十六进制
     */
    fillColor?: string
    /** 半径 */
    radius: number
    /** 描边的宽度 */
    strokeWidth?: number
  }
  /** 在地图上显示控件，控件不随着地图移动。即将废弃，请使用 cover-view
   * @deprecated
   */
  interface control {
    /** 控件id
     * @remarks 在控件点击事件回调会返回此id
     */
    id?: number
    /** 控件在地图的位置
     * @remarks 控件相对地图位置
     */
    position: position
    /** 显示的图标
     * @remarks 项目目录下的图片路径，支持本地路径、代码包路径
     */
    iconPath: string
    /** 是否可点击
     * @remarks 默认不可点击
     */
    clickable?: boolean
  }
  interface point {
    /** 经度 */
    longitude: number
    /** 纬度 */
    latitude: number
  }
  interface position {
    /** 距离地图的左边界多远
     * @default 0
     */
    left: number
    /** 距离地图的上边界多远
     * @default 0
     */
    top: number
    /** 控件宽度
     * @default 图片宽度
     */
    width: number
    /** 控件高度
     * @default 图片宽度
     */
    height: number
  }
  interface groundOverlays {
    /**刷新的时候需要变更id值 */
    id: string
    /**右上 左下 */
    'include-points': [
      {
        latitude: number
        longitude: number
      },
      {
        latitude: number
        longitude: number
      }
    ]
    image: string
    alpha: number
    zIndex: number
  }
  interface tileOverlay {
    url: string
    type: number
    tileWidth: number
    tileHeight: number
    zIndex: number
  }
  interface panels {
    id: number
    layout: {
      src: string
    }
    position: position
  }
  interface onMarkerTapEventDetail {
    markerId: number | string
  }
  interface onLabelTapEventDetail {
    markerId: number | string
  }
  interface onControlTapEventDetail {
    controlId: number | string
  }
  interface onCalloutTapEventDetail {
    markerId: number | string
  }
  namespace RegionChangeDetail {
    interface type {
      begin
      end
    }
    interface CausedByBegin {
      /** 手势触发 */
      gesture
      /** 接口触发 */
      update
    }
    interface CausedByEnd {
      /** 拖动导致 */
      drag
      /** 缩放导致 */
      scale
      /** 调用更新接口导致 */
      update
    }
  }
  interface onRegionEventDetail<T = keyof RegionChangeDetail.type> {
    /** 视野变化开始、结束时触发
     * @remarks 视野变化开始为begin，结束为end
     */
    type: T
    /** 导致视野变化的原因
     * @remarks 有效值为 gesture（手势触发）、update（接口触发或调用更新接口导致）、drag（拖动导致）、scale（缩放导致）
     */
    causedBy: keyof (T extends 'begin' ? RegionChangeDetail.CausedByBegin : RegionChangeDetail.CausedByEnd)
    /** 视野改变详情 */
    detail: regionChangeDetail<RegionChangeDetail.type>
  }
  interface regionChangeDetail<T = keyof RegionChangeDetail.type> {
    /** 旋转角度 */
    rotate: number
    /** 倾斜角度 */
    skew: number
    causedBy: keyof (T extends 'begin' ? RegionChangeDetail.CausedByBegin : RegionChangeDetail.CausedByEnd)
    type: T | string
    scale: number
    centerLocation: point
    region: {
      northeast: point
      southeast: point
    }
  }
  interface onPoiTapEventDetail {
    name: string
    longitude: number
    latitude: number
  }
  interface onPolylineTapEventDetail {
    polylineId: number
    longitude: number
    latitude: number
  }
  interface onAbilityEventDetail {
    ability: string
    errCode: number
    errMsg: string
  }
  interface onInterpolatePointEventDetail {
    markerId: number
    longitude: number
    latitude: number
    animationStatus: 'interpolating' | 'complete'
  }
}
/** 地图。相关api Taro.createMapContext。
 * @classification maps
 * @supported weapp, alipay, swan, tt, qq, jd
 * @example_react
 * ```tsx
 * class App extends Component {
 *   onTap () {}
 *   render () {
 *     return (
 *       <Map onClick={this.onTap} />
 *     )
 *   }
 * }
 * ```
 * @example_vue
 * ```html
 * <template>
 *   <map
 *     id="map"
 *     style="width: 100%; height: 300px;"
 *     longitude="113.324520"
 *     latitude="23.099994"
 *     scale="14"
 *     :markers="markers"
 *     :polyline="polyline"
 *     :show-location="true"
 *     `@regionchange="regionchange"
 *     `@markertap="markertap"
 *   />
 * </template>
 *
 * <script>
 * export default {
 *   data() {
 *     return {
 *       markers: [{
 *         iconPath: "https://avatars2.githubusercontent.com/u/1782542?s=460&u=d20514a52100ed1f82282bcfca6f49052793c889&v=4",
 *         id: 0,
 *         latitude: 23.099994,
 *         longitude: 113.324520,
 *         width: 50,
 *         height: 50
 *       }],
 *       polyline: [{
 *         points: [{
 *           longitude: 113.3245211,
 *           latitude: 23.10229
 *         }, {
 *           longitude: 113.324520,
 *           latitude: 23.21229
 *         }],
 *         color:"#FF0000DD",
 *         width: 2,
 *         dottedLine: true
 *       }]
 *     }
 *   },
 *   methods: {
 *     regionchange(e) {
 *       console.log(e.type)
 *     },
 *     markertap(e) {
 *       console.log("markertap:", e.detail.markerId)
 *     }
 *   }
 * }
 * </script>
 * ```
 * @see https://developers.weixin.qq.com/miniprogram/dev/component/map.html#map
 */
declare const Map: ComponentType<MapProps>
export { Map, MapProps }
