import {Vector2, Vector3} from 'three';
import {PolyDictionary} from '../../types/GlobalTypes';
import {JsConnectionPointType} from '../nodes/utils/io/connections/Js';
import {clamp as _clamp} from '../../core/math/_Module';

const RGB = ['r', 'g', 'b'];
const XY = ['x', 'y'];
const XYZ = ['x', 'y', 'z'];
const XYZW = ['x', 'y', 'z', 'w'];
const COMPONENT_BY_JS_TYPE: PolyDictionary<string[]> = {
	[JsConnectionPointType.COLOR]: RGB,
	[JsConnectionPointType.VECTOR2]: XY,
	[JsConnectionPointType.VECTOR3]: XYZ,
	[JsConnectionPointType.VECTOR4]: XYZW,
};
export function componentsForType(type: JsConnectionPointType) {
	return COMPONENT_BY_JS_TYPE[type] || [];
}

//
//
//
//
//
export function _v2Function(src: Vector2, target: Vector2, _func: (x: number) => number): Vector2 {
	target.x = _func(src.x);
	target.y = _func(src.y);
	return target;
}
export function _v3Function(src: Vector3, target: Vector3, _func: (x: number) => number): Vector3 {
	target.x = _func(src.x);
	target.y = _func(src.y);
	target.z = _func(src.z);
	return target;
}
export function absV2(src: Vector2, target: Vector2): Vector2 {
	return _v2Function(src, target, Math.abs);
}
export function absV3(src: Vector3, target: Vector3): Vector3 {
	return _v3Function(src, target, Math.abs);
}
export function maxV3Components(src: Vector3): number {
	return Math.max(src.x, Math.max(src.y, src.z));
}
export function vector3Clamp(src: Vector3, min: Vector3, max: Vector3, target: Vector3): Vector3 {
	target.x = _clamp(src.x, min.x, max.x);
	target.y = _clamp(src.y, min.y, max.y);
	target.z = _clamp(src.z, min.z, max.z);
	return target;
}
export function maxV3Component(src: Vector3, target: Vector3, value: number): Vector3 {
	target.x = Math.max(src.x, value);
	target.y = Math.max(src.y, value);
	target.z = Math.max(src.z, value);
	return target;
}
export function vector2MaxScalar(src: Vector2, scalar: number, target: Vector2) {
	target.x = Math.max(src.x, scalar);
	target.y = Math.max(src.y, scalar);
	return target;
}

export function vector2Dot(src: Vector2) {
	return src.dot(src);
}
