import { EEnemySize } from '../data/EEnemySize';
import { EProjectileEffectType } from '../data/EProjectileEffectType';
import { GdProjectileEffect } from '../data/GdProjectileEffect';
import { Hex } from '../util/Hex';
import { Vector2 } from '../util/Vector2';
import { SimLevel } from './SimLevel';

export class SimEnemy {
	index: number = -1;
	routeIdx: number = -1;
	startHex: Hex = new Hex(0, 0);
	endHex: Hex = new Hex(0, 0);
	path: number[] = [];
	prevPosition: Vector2 = new Vector2(0, 0);
	position: Vector2 = new Vector2(0, 0);
	direction: Vector2 = new Vector2(0, 0);
	currentPathIndex: number = -1;
	currentPathStep: number = -1;
	currentPathPosition: Vector2 = new Vector2(0, 0);
	dead: boolean = false;
	hitPonts: number = 0;
	size: EEnemySize = EEnemySize.Tiny;
	speed: number = 0;
	gain: number = 0;

	constructor(index: number, routeIdx: number) {
		this.index = index;
		this.routeIdx = routeIdx;
	}

	public suffer(level: SimLevel, effect: GdProjectileEffect) {
		switch (effect.type) {
			case EProjectileEffectType.Damage: {
				this.hitPonts -= effect.amount;
				if (this.hitPonts <= 0) {
					level.currency += this.gain;
					this.dead = true;
				}
				break;
			}
		}
	}

	public onPathUpdated(level: SimLevel) {
		const myPos = this.position;
		this.currentPathPosition = myPos;

		if (this.path == null) {
			return;
		}

		const current = this.path[this.currentPathIndex];
		const next = this.path[this.currentPathIndex + 1];
		if (!next) {
			return;
		}

		const cells = level.cells;
		const pos1 = cells[current].hex.toWorld();
		const pos2 = cells[next].hex.toWorld();
		const myDir = pos2.subtract(myPos);
		const myLen = myDir.magnitude();
		const hexDir = pos2.subtract(pos1);
		const hexLen = hexDir.magnitude();
		if (myLen > hexLen) {
			this.path.unshift(this.path[0]);
		}

		this.direction = myDir.multiplyScalar(1 / myLen);
	}
}
