import {IPromotionRoles, IRequiredClaim, ISchemaAttribute, ISchemaClass} from '@essential-projects/core_contracts';
import {INamespaceDecorators, IPromoteDecorator,
  IRequiresClaimDecorator, ISchemaAttributeDecorator, ISchemaClassDecorator} from '@essential-projects/metadata_contracts';
import {promote, requiresClaim, schemaAttribute, schemaClass} from './index';

export function createDecoratorsForNamespace(namespace: string): INamespaceDecorators {

  const namespaceSchemaAttribute: (schema: ISchemaAttribute) => ISchemaAttributeDecorator = (schema: ISchemaAttribute): ISchemaAttributeDecorator => {
    return schemaAttribute(schema, namespace);
  };

  const namespaceSchemaClass: (schema: ISchemaClass) => ISchemaClassDecorator = (schema: ISchemaClass): ISchemaClassDecorator => {
    return schemaClass(schema, namespace);
  };

  const namespaceRequiresClaim: (claim: IRequiredClaim) => IRequiresClaimDecorator = (claim: IRequiredClaim): IRequiresClaimDecorator => {
    return requiresClaim(claim, namespace);
  };

  const namespacePromote: (roles: IPromotionRoles) => IPromoteDecorator = (roles: IPromotionRoles): IPromoteDecorator => {
    return promote(roles, namespace);
  };

  const namespaceDecorators: INamespaceDecorators = {
    schemaAttribute: namespaceSchemaAttribute,
    schemaClass: namespaceSchemaClass,
    requiresClaim: namespaceRequiresClaim,
    promote: namespacePromote,
  };

  return namespaceDecorators;
}
