import { GenericClassDecorator } from "../../types/types";
import { Constructable } from "../../types/constructable";
import { METADATA_KEY } from "../../constants/metadata.keys";
import { ERRORS_MSGS } from "../../constants/error-msgs";

export class BaseProvider {}
export function Provider<T extends BaseProvider>(): GenericClassDecorator<Constructable<T>> {
	return (target: Constructable<T>) => {
		if (Reflect.hasOwnMetadata(METADATA_KEY.PROVIDER_PARAM_TYPES, target)) {
			throw new Error(ERRORS_MSGS.DUPLICATED_PROVIDER_DECORATOR);
		}
		var types = Reflect.getMetadata(METADATA_KEY.DESIGN_PARAM_TYPES, target) || [];
		Reflect.defineMetadata(METADATA_KEY.PROVIDER_PARAM_TYPES, types, target);
		return target;
	};
}
