import { Behavior } from '@matter/node';
import type { Family } from 'isy-nodejs/Definitions/Global/Families';
import type { ISYDevice } from 'isy-nodejs/ISYDevice';
import { Factory } from 'isy-nodejs/Utils';
import { Registry } from 'isy-nodejs/Registry';

export namespace BehaviorRegistry {
	const registry = new Registry<string, Behavior.Type>();

	export function register<T extends Behavior.Type, F extends Family>(behavior: T & { cluster: { name: string }; factory?: Factory<any> }, family?: keyof typeof Family): void {
		if (family) {
			registry.register(behavior.cluster.name.toLowerCase(), behavior, family);
			return;
		}
		registry.register(behavior.cluster.name.toLowerCase(), behavior, behavior.factory as any);
	}

	export function get<T extends ISYDevice.Any>(node: T, cluster: string): Behavior.Type {
		return registry.get(node, cluster.toLowerCase());
	}

	/*const registry: {[x:string]: Behavior.Type} = {};
	const nodeLevelRegistry: {[x:string]: {[x:string]: Behavior.Type}} = {};



	register<T extends Behavior.Type>(behavior: T & {cluster: {name: string}, nodeClass: {nodeDefId}} ): void
	{
		registry[behavior.cluster.name.toLowerCase()] = behavior;
		nodeLevelRegistry[behavior.nodeClass.nodeDefId] = nodeLevelRegistry[behavior.
		nodeClass.nodeDefId] ?? {};
		nodeLevelRegistry[behavior.nodeClass.nodeDefId][behavior.cluster.name.toLowerCase()] = behavior;

	}

	 function get(nodeClass: typeof ISYNode, cluster: string): Behavior.Type
	{
		if(nodeLevelRegistry[nodeClass.nodeDefId])
			return nodeLevelRegistry[nodeClass.nodeDefId][cluster.toLowerCase()];
		else
			for (const nodeDefId in NodeFactory.getImplements(nodeClass))
			{
				if(nodeLevelRegistry[nodeDefId][cluster.toLowerCase()])
					return nodeLevelRegistry[nodeDefId][cluster.toLowerCase()];
			}
		return registry[cluster.toLowerCase()];

	}*/
}
