import { makePropDecorator } from '../../google-decorator-factories';
import { BindDecorator } from '../bind.decorator';
import { Hypermedia, HypermediaAction } from 'first-npm-package-nicule/core';

interface ActionBindingSettings {
    transforms?: Array<(hypermediaAction: HypermediaAction, hypermedia: Hypermedia) => HypermediaAction>;
    secure?: boolean;
}

export interface BindActionDecorator {
    (actionName: string, settings?: ActionBindingSettings): any;
    new(actionName: string, settings?: ActionBindingSettings): any;
}

export const Action: BindActionDecorator = makePropDecorator('BindAction', (actionName: string, { transforms }: ActionBindingSettings = {} as any) => {
    return ({
        binding: {
            priority: 1,
            bind: hypermedia => {
                const { actions = [] } = hypermedia;
                let action = actions.find(({ name }) => actionName === name);
                if (action === undefined) {
                    return undefined;
                }
                if (transforms instanceof Array && transforms.length > 0) {
                    action = transforms.reduce((newAction, transformer) => transformer(newAction, hypermedia), action);
                }

                return action;
            }
        } as BindDecorator
    }) as any;
});
