import { Node, Vec2, Vec3 } from 'cc'

import MathUtils from './MathUtils'

export class MoveHelper {
  public static _vec3: Vec3 = new Vec3()
  public static _vec2_0: Vec2 = new Vec2()
  public static _vec2_1: Vec2 = new Vec2()

  public static moveNode(
    moveNode: Node,
    speed: number,
    tx: number,
    ty: number,
    minSpeed: number = 0.01,
  ) {
    let isMoving: boolean = false
    let times: number = 0
    moveNode.getPosition(MoveHelper._vec3)
    MoveHelper._vec2_0.x = MoveHelper._vec3.x
    MoveHelper._vec2_0.y = MoveHelper._vec3.y
    MoveHelper._vec2_1.x = tx
    MoveHelper._vec2_1.y = ty
    const rad: number = MathUtils.p2pRad(MoveHelper._vec2_0, MoveHelper._vec2_1)
    const speedX: number = speed * Math.cos(rad)
    const speedY: number = speed * Math.sin(rad)
    if (Math.abs(MoveHelper._vec3.x - tx) > minSpeed) {
      times = Math.floor(Math.abs(speedX / minSpeed))
      for (let i = 0; i < times; i++) {
        if (MoveHelper._vec3.x > tx) {
          MoveHelper._vec3.x -= minSpeed
          moveNode.setPosition(MoveHelper._vec3)
        } else {
          MoveHelper._vec3.x += minSpeed
          moveNode.setPosition(MoveHelper._vec3)
        }
        if (Math.abs(MoveHelper._vec3.x - tx) <= minSpeed * 2) {
          MoveHelper._vec3.x = tx
          moveNode.setPosition(MoveHelper._vec3)
        }
      }
      isMoving = true
    }
    if (Math.abs(MoveHelper._vec3.y - ty) > minSpeed) {
      times = Math.floor(Math.abs(speedY / minSpeed))
      for (let j = 0; j < times; j++) {
        if (MoveHelper._vec3.y > ty) {
          MoveHelper._vec3.y -= minSpeed
          moveNode.setPosition(MoveHelper._vec3)
        } else {
          MoveHelper._vec3.y += minSpeed
          moveNode.setPosition(MoveHelper._vec3)
        }
        if (Math.abs(MoveHelper._vec3.x - ty) <= minSpeed * 2) {
          MoveHelper._vec3.y = ty
          moveNode.setPosition(MoveHelper._vec3)
        }
      }
      isMoving = true
    }
    return isMoving
  }
}
