import { makePropDecorator } from '../../google-decorator-factories';
import { Type } from '@angular/core';
import { BindDecorator } from '../bind.decorator';
import { ReflectiveModelBinderFactory, ReflectiveQueryMatcherFactory } from '../../services';

export interface BindEntitiesDecorator {
    <T>(queryType: Type<T>): any;
    new <T>(queryType: Type<T>): any;
}

export const Entities: BindEntitiesDecorator = makePropDecorator('BindEntity', <T>(queryType: Type<T>) => {
    return ({
        binding: {
            priority: 1,
            bind: (({ entities = [] }, fieldName, injector) => {
                const modelBinderProvider = injector.get(ReflectiveModelBinderFactory);
                const queryMatcherFactory = injector.get(ReflectiveQueryMatcherFactory);

                const modelBinder = modelBinderProvider.make(queryType);
                const queryMatcher = queryMatcherFactory.make(queryType);

                return entities
                    .filter(hypermedia => queryMatcher.matches(hypermedia))
                    .map(hypermedia => modelBinder.bind(hypermedia));
            })
        } as BindDecorator
    }) as any;
});
