import {Object3DWithGeometry} from '../../../core/geometry/Group';
import {PlayerCollisionController} from './collisions/PlayerCollisionsController';
import {Object3D} from 'three';
import {Mesh} from 'three';
import {Capsule} from 'three/examples/jsm/math/Capsule';
import {EventDispatcher} from 'three';
import {Vector3} from 'three';

export interface JumpParams {
	duration: number;
	force: number;
}

export class BaseCollisionHandler extends EventDispatcher<{change: any}> {
	protected _playerCollisionController: PlayerCollisionController | undefined;

	setCheckCollisions(collisionObject?: Object3D) {
		if (collisionObject) {
			let objectWithGeo: Object3DWithGeometry | undefined;
			collisionObject.traverse((child) => {
				if (!objectWithGeo) {
					const mesh = child as Mesh;
					if (mesh.geometry) {
						objectWithGeo = mesh;
					}
				}
			});
			if (objectWithGeo) {
				this._playerCollisionController = new PlayerCollisionController(objectWithGeo);
			} else {
				console.error('no geo found in', collisionObject);
			}
		} else {
			this._playerCollisionController = undefined;
		}
	}
	setCollisionCapsule(capsule: Capsule) {
		this._playerCollisionController?.setCapsule(capsule);
	}
	setJumpParams(params: JumpParams) {}
	setGravity(gravity: Vector3) {}
	setPlayerMass(mass: number) {}
}
