import * as planck from 'planck'
import { SpriteInstance } from '../shared/sprites'
import { WorldContext } from './World'
import { Zone } from './Zone'

export class Entity {
  sprite: SpriteInstance
  body?: planck.Body
  velocity: [number, number] = [0, 0]
  acceleration: number = 0.5
  maxSpeed: number = 4
  direction: number = 0
  turnRate: number = 10
  zones: Zone[] = []
  contacts: Entity[] = []

  constructor(ctor: string) {
    this.sprite = new SpriteInstance(ctor)
  }

  update(delta: number, ctx?: WorldContext) {
    this.sprite.update(delta)
  }

  get position(): [number, number] {
    if (this.body) {
      let p = this.body.getPosition()
      return [p.x, p.y]
    }
    return [this.sprite.container.x, this.sprite.container.y]
  }
  get x(): number {
    if (this.body) {
      let p = this.body.getPosition()
      return p.x
    }
    return this.sprite.container.x
  }
  set x(v: number) {
    if (this.body) {
      let p = this.body.getPosition()
      this.body.setPosition(
        planck.Vec2(
          v,
          p.y,
        )
      )
    } else {
      this.sprite.container.x = v
    }
  }
  get y(): number {
    if (this.body) {
      let p = this.body.getPosition()
      return p.y
    }
    return this.sprite.container.y
  }
  set y(v: number) {
    if (this.body) {
      let p = this.body.getPosition()
      this.body.setPosition(
        planck.Vec2(
          p.x,
          v,
        )
      )
    } else {
      this.sprite.container.y = v
    }
  }
  addZoneContact(zone: Zone) {
    if (this.zones.find(v=>v===zone)) return
    this.zones.push(zone)
  }
  removeZoneContact(zone: Zone) {
    this.zones = this.zones.filter(v=>v!==zone)
  }
  addEntityContact(entity: Entity) {
    if (this.contacts.find(v=>v===entity)) return
    this.contacts.push(entity)
  }
  removeEntityContact(entity: Entity) {
    this.contacts = this.contacts.filter(v=>v!==entity)
  }
}
