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 { RandomBehaviour } from "../characters/character_ai/RandomBehaviour";
import * as Utils from "../core/FunctionLibrary";
import {
  ModelType,
  DriverType,
} from "../enums/WorldType";
export class EnemySpawnPoint implements ISpawnPoint {
  private object: THREE.Object3D;
  public driver: string;
  public firstAINode: string;

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

  public spawn(
    loadingManager: LoadingManager,
    world: World
  ): void {
    loadingManager.loadGLTF(world.worldOptions?.enemyModel, (model) => {
      let player = new Character(model, world.worldOptions?.enemyTexture, ModelType.ENEMY, 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);
      if (this.driver === DriverType.RANDOM) {
        player.setBehaviour(new RandomBehaviour());
      }
      player = undefined;
      worldPos = undefined;
      forward = undefined;
    });
  }

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