import { randomUUID } from 'node:crypto'
import { BaseEntity } from '@/application/base/baseEntity'
import { MapEventTileType } from '@/application/enums'
import type { UUID } from '@/application/types'
import type { Map } from '@/entities/map'
import type { MapEventTileTeleport } from '@/entities/mapEventTileTeleport'
import { Enum, ManyToOne, OneToOne, PrimaryKey, Property } from '@mikro-orm/core'

export class BaseMapEventTile extends BaseEntity {
  @PrimaryKey()
  id = randomUUID()

  @ManyToOne({ deleteRule: 'cascade' })
  map!: Map

  @Enum(() => MapEventTileType)
  type!: MapEventTileType

  @Property()
  positionX: number = 0

  @Property()
  positionY: number = 0

  @OneToOne({ eager: true, deleteRule: 'cascade', orphanRemoval: true })
  teleport?: MapEventTileTeleport

  setId(id: UUID) {
    this.id = id
    return this
  }

  getId() {
    return this.id
  }

  setMap(map: Map) {
    this.map = map
    return this
  }

  getMap() {
    return this.map
  }

  setType(type: MapEventTileType) {
    this.type = type
    return this
  }

  getType() {
    return this.type
  }

  setPositionX(positionX: number) {
    this.positionX = positionX
    return this
  }

  getPositionX() {
    return this.positionX
  }

  setPositionY(positionY: number) {
    this.positionY = positionY
    return this
  }

  getPositionY() {
    return this.positionY
  }

  setTeleport(teleport: MapEventTileTeleport) {
    this.teleport = teleport
    return this
  }

  getTeleport() {
    return this.teleport
  }
}