import { ObjectType, Field, Float, Int, Arg, Query, Resolver, createUnionType } from 'type-graphql';
import { Inject } from 'typedi';
{{#entities}}  
import { {{type}} } from '../{{model}}/{{model}}.model';
{{/entities}}  
import { {{query.typePrefix}}FTSService } from './{{query.name}}.service';

{{#whereInputs}}
import { {{#entities}} {{type}}WhereInput, {{/entities}} } from '../../../generated';
{{/whereInputs}}

@ObjectType()
export class {{query.typePrefix}}FTSOutput {
    @Field(type => {{query.typePrefix}}SearchItem)
    item!: typeof {{query.typePrefix}}SearchItem

    @Field(type => Float)
    rank!: number

    @Field(type => String)
    isTypeOf!: string

    @Field(type => String)
    highlight!: string
}

export const {{query.typePrefix}}SearchItem = createUnionType({
    name: "{{query.typePrefix}}SearchResult",
    types: () => [
    {{#entities}}  
        {{type}},
    {{/entities}}     
    ],
});


@Resolver()
export default class {{query.typePrefix}}FTSResolver {

    constructor(@Inject('{{query.typePrefix}}FTSService') readonly service: {{query.typePrefix}}FTSService) {}

    @Query(() => [{{query.typePrefix}}FTSOutput])
    async {{query.name}}(
      @Arg('text') query: string, 
      @Arg('limit', () => Int, { defaultValue: 5 }) limit: number,
      @Arg('skip', () => Int, { defaultValue: 0 }) skip: number,
      {{#entities}}
      @Arg('where{{type}}', { nullable: true }) where{{type}}?: {{type}}WhereInput,
      {{/entities}}
    ):Promise<Array<{{query.typePrefix}}FTSOutput>>{
      return this.service.search(query, limit, skip, {{#entities}}where{{type}},{{/entities}});
    }

}
