import { ISpawnPoint } from "../interfaces/ISpawnPoint";
import * as THREE from "three";
import { World } from "./World";
import { Character } from "../characters/Character";
import { LoadingManager } from "../core/LoadingManager";
import * as Utils from "../core/FunctionLibrary";
import {
  ModelType,
} from "../enums/WorldType";

export class CharacterSpawnPoint implements ISpawnPoint {
  private object: THREE.Object3D;

  constructor(object: THREE.Object3D) {
    this.object = object;
  }

  public spawn(
    loadingManager: LoadingManager,
    world: World
  ): void {
    loadingManager.loadGLTF(world.worldOptions?.playerModel, (model) => {
      let player = new Character(model, world.worldOptions?.playerTexture, ModelType.PLAYER, this.object.name);
      let worldPos = new THREE.Vector3();
      this.object.getWorldPosition(worldPos);
      player.setPosition(worldPos.x, worldPos.y, worldPos.z);
      let forward = Utils.getForward(this.object);
      player.setOrientation(forward, true);
      world.add(player);
      player.takeControl();
      player = undefined;
      worldPos = undefined;
      forward = undefined;
    });
  }

  public destroy(): void {
    this.object = undefined;
  }
}
