import type { MutableEndpoint, SupportedBehaviors } from '@matter/node';

enum RequirementType {
	Client = 1,
	Server = 1 << 1,
	Optional = 1 << 2,
	Mandatory = 1 << 3,
	All = Client | Server | Optional | Mandatory
	/*AllServer = Server | Optional | Mandatory,
	AllClient = Client | Optional | Mandatory,
	AllOptional = Server | Client | Optional,
	AllMandatory = Server | Client | Mandatory*/
}

function hasFlag<T extends number>(value: T, flag: T): boolean {
	return (value & flag) === flag;
}

export function getRequiredBehaviors<D extends MutableEndpoint>(deviceType: D, requirements: RequirementType = RequirementType.All): SupportedBehaviors {
	let behaviors: SupportedBehaviors = {};
	if (hasFlag(requirements, RequirementType.Client)) {
		if (hasFlag(requirements, RequirementType.Mandatory)) {
			behaviors = { ...behaviors, ...(deviceType.requirements.client?.mandatory ?? {}) };
		}
		if (hasFlag(requirements, RequirementType.Optional)) {
			behaviors = { ...behaviors, ...(deviceType.requirements.client?.optional ?? {}) };
		}
	}
	if (hasFlag(requirements, RequirementType.Server)) {
		if (hasFlag(requirements, RequirementType.Mandatory)) {
			behaviors = { ...behaviors, ...(deviceType.requirements.server?.mandatory ?? {}) };
		}
		if (hasFlag(requirements, RequirementType.Optional)) {
			behaviors = { ...behaviors, ...(deviceType.requirements.server?.optional ?? {}) };
		}
	}
	return behaviors;
}
