/**
 * places input objects in a grid pattern.
 *
 *
 *
 */
import {TypedSopNode} from './_Base';
import {CoreGroup} from '../../../core/geometry/Group';
import {ObjectsLayoutSopOperation} from '../../operations/sop/ObjectsLayout';
import {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';
import {SopType} from '../../poly/registers/nodes/types/Sop';
const DEFAULT = ObjectsLayoutSopOperation.DEFAULT_PARAMS;
class ObjectsLayoutSopParamConfig extends NodeParamsConfig {
	/** @param layout width */
	maxLayoutWidth = ParamConfig.FLOAT(DEFAULT.maxLayoutWidth, {range: [0, 10]});
	/** @param row height */
	rowHeight = ParamConfig.FLOAT(DEFAULT.rowHeight, {range: [0, 10]});
	/** @param padding between objects */
	padding = ParamConfig.VECTOR2(DEFAULT.padding.toArray());

	/** @param addAttribs */
	addAttribs = ParamConfig.BOOLEAN(DEFAULT.addAttribs);
	/** @param add row index attribute */
	addRowAttrib = ParamConfig.BOOLEAN(DEFAULT.addRowAttrib, {
		visibleIf: {addAttribs: 1},
	});
	/** @param add rowWidthInner attribute */
	addRowWidthInner = ParamConfig.BOOLEAN(DEFAULT.addRowWidthInner, {
		visibleIf: {addAttribs: 1},
	});
	/** @param add rowWidthOuter attribute */
	addRowWidthOuter = ParamConfig.BOOLEAN(DEFAULT.addRowWidthOuter, {
		visibleIf: {addAttribs: 1},
	});
}
const ParamsConfig = new ObjectsLayoutSopParamConfig();

export class ObjectsLayoutSopNode extends TypedSopNode<ObjectsLayoutSopParamConfig> {
	override paramsConfig = ParamsConfig;
	static override type() {
		return SopType.OBJECTS_LAYOUT;
	}

	override initializeNode() {
		this.io.inputs.setCount(1);
		this.io.inputs.initInputsClonedState(ObjectsLayoutSopOperation.INPUT_CLONED_STATE);
	}

	private _operation: ObjectsLayoutSopOperation | undefined;
	override cook(inputCoreGroups: CoreGroup[]) {
		this._operation = this._operation || new ObjectsLayoutSopOperation(this.scene(), this.states, this);
		const coreGroup = this._operation.cook(inputCoreGroups, this.pv);
		this.setCoreGroup(coreGroup);
	}
}
