import store from '@/store'
import AMapLoader from '@amap/amap-jsapi-loader'

export function toPixel(arr) {
  return new window.AMap.Pixel(arr[0], arr[1])
}

export function toSize(arr) {
  return new window.AMap.Size(arr[0], arr[1])
}

export function pixelTo(pixel) {
  if (Array.isArray(pixel)) return pixel
  return [pixel.getX(), pixel.getY()]
}

export function toLngLat(arr) {
  return new window.AMap.LngLat(arr[0], arr[1])
}

export function lngLatTo(lngLat) {
  if (!lngLat) return
  if (Array.isArray(lngLat)) return lngLat.slice()
  return [lngLat.getLng(), lngLat.getLat()]
}

/**
 * 逆地址解析
 * @param coordinate 坐标数组[lng,lat]
 * @returns {*[]}
 */
export function reverseLnglat(coordinate) {
  let lnglat = []
  if (coordinate instanceof Array) { // 如果是Array[lng,lat]
    lnglat = coordinate
  } else if (coordinate instanceof String) { // 如果是字符串(lng,lat)
    lnglat = coordinate.split(',')
  } else if (coordinate instanceof Object) {
    lnglat = [coordinate.lng, coordinate.lat]
  }
  return new Promise((resolve, reject) => {
    if (lnglat.length === 2) {
      AMapLoader.load({
        key: store.getters.amapKey // 秘钥
      }).then((AMap) => {
        AMap.plugin('AMap.Geocoder', function() {
          var geocoder = new AMap.Geocoder({ city: '' })
          geocoder.getAddress(lnglat, function(status, result) {
            if (status === 'complete' && result.info === 'OK') {
              resolve(result.regeocode)
              // result为对应的地理位置详细信息
            } else {
              reject('no address')
            }
          })
        })
      }).catch(error => {
        reject(error)
      })
    } else {
      reject('no address')
    }
  })
}

/**
 * 坐标系转换
 * @param coordinate 坐标数组[lng,lat]
 */
export function convertLnglat(coordinate) {
  // 安全码
  window._AMapSecurityConfig = {
    securityJsCode: store.getters.amapSecurityCode
  }
  return new Promise((resolve, reject) => {
    AMapLoader.load({
      key: store.getters.amapKey // 秘钥
    }).then((AMap) => {
      // debugger
      AMap.convertFrom(coordinate, 'gps', (status, result) => {
        if (result.info === 'ok') {
          const lnglats = result.locations[0]
          resolve([lnglats.lng, lnglats.lat])
          // Array.<LngLat>
        } else {
          reject('convert error:' + result.info)
        }
      })
    })
  })
}

/**
 * @param arrs 二重数组 southWest, northEast
 */
export function toBounds(arrs) {
  return new window.AMap.Bounds(toLngLat(arrs[0]), toLngLat(arrs[1]))
}

export const commonConvertMap = {
  position: toLngLat,
  offset: toPixel,
  bounds: toBounds,
  LngLat: toLngLat,
  Pixel: toPixel,
  Size: toSize,
  Bounds: toBounds
}
