import { MapCoordTrans } from '../export/MapCoordTrans'

export default class Lonlat2Three {
  constructor(origin, lonlatOri, ref, lonlatRef, scale) {
    this.origin = origin
    this.lonlatOri = lonlatOri
    this.ref = ref
    this.lonlatRef = lonlatRef
    this.coord = new MapCoordTrans()
    this.mercatorLonlat = this.coord.lonLatToMercator([this.lonlatOri.lon, this.lonlatOri.lat])
    this.mercatorLonlatRef = this.coord.lonLatToMercator([this.lonlatRef.lon, this.lonlatRef.lat])
    this.scale = scale || 1
  }
  // lonla——{lon:经度,lat:纬度，height：高度（基于场景地面水平面的高度，正为水平面之上，负为水平面之下,默认为0）}
  // threejs坐标系： 横向x轴，向右为正；纵向z轴，向下为正；y轴垂直于xz平面，向上为正；
  // 墨卡托坐标系：横向x轴，向右为正；纵向y轴，向上为正；
  toThree(lonlat) {
    var mer = this.coord.lonLatToMercator([lonlat.lon, lonlat.lat])
    var dir = { x: mer[0] - this.mercatorLonlat[0], y: 0, z: this.mercatorLonlat[1] - mer[1] }
    var length = this.coord.getDistance(mer, this.mercatorLonlat)
    // console.log('mer length:', mer, length)
    var mlen = this.coord.getDistance(this.mercatorLonlatRef, this.mercatorLonlat)

    length = (length / mlen) * this.scale

    var mlen1 = Math.sqrt(Math.pow(dir.x, 2) + Math.pow(dir.y, 2) + Math.pow(dir.z, 2))
    var pos = {
      x: this.origin.x + (dir.x / mlen1) * length,
      y: (lonlat.height / mlen1) * this.scale,
      z: this.origin.z + (dir.z / mlen1) * length
    }
    // console.log('mer nor:', { x: dir.x / mlen1, y: dir.y / mlen1, z: dir.z / mlen1 })

    console.log('three:', pos)
    return pos
  }
  toLonlat(pos) {
    var dir = { x: pos.x - this.origin.x, y: 0, z: pos.z - this.origin.z }
    var len = Math.sqrt(Math.pow(dir.x, 2) + Math.pow(dir.y, 2) + Math.pow(dir.z, 2))

    var slen = this.coord.getDistance(this.mercatorLonlatRef, this.mercatorLonlat)

    var length = (len * slen) / this.scale
    // console.log('vec length:', length)
    var nor = { x: len == 0 ? 0 : dir.x / len, y: len == 0 ? 0 : dir.y / len, z: len == 0 ? 0 : dir.z / len }

    var mer = {
      x: this.mercatorLonlat[0] + length * nor.x,
      y: this.mercatorLonlat[1] - length * nor.z,
      z: (pos.y / this.scale) * length
    }

    // console.log('transmer:', mer, nor)
    var lonlat = this.coord.mercatorToLonlat([mer.x, mer.y])
    return { lon: lonlat[0], lat: lonlat[1] }
  }
  // list——批量传入带高度经纬度坐标 [{lon:经度,lat:纬度，height：高度（基于场景地面水平面的高度，正为水平面之上，负为水平面之下，默认为0）},...]
  batchToThree(list) {
    var batch = []
    for (var i = 0; i < list.length; i++) {
      var lonlat = {
        lon: list[i].lon,
        lat: list[i].lat,
        height: list[i].height
      }
      batch.push(this.toThree(lonlat))
    }
    return batch
  }
}
