<%_
const pkType = getPkType(databaseType) === 'Long' ? 'number' : 'string';
const CreateDocument = `Create${entityAngularName}Document`;
const FindDocument = `Get${entityAngularName}Document`;
const GetDocument = `Get${entityNamePlural}Document`;
const DeleteDocument = `Delete${entityAngularName}Document`;
const UpdateDocument = `Update${entityAngularName}Document`;
const namedImports = [ CreateDocument, FindDocument, GetDocument, DeleteDocument, UpdateDocument ];
let importSpecifier;
let createVars, updateVars;
if (typeDefinition === 'TypeScript') {
    importSpecifier = `./${entityFileName}.gql`;
} else {
    importSpecifier = '@/graphql';
}
_%>

import { client } from '@/shared/config/apollo-client';
import { buildPaginationOptions, toHttpResponse, toPagedHttpResponse } from '@/shared/graphql/graphql.util';
import { I<%= entityAngularName %> } from '@/shared/model/<%= entityModelFileName %>.model';
import { <%= namedImports.join(', ') %> } from '<%= importSpecifier %>';

export default class <%= entityAngularName %>Service {

  public find(_id: any) : Promise<I<%= entityAngularName %>> {
    const id = this.getId(_id);
    return client.query({ query: <%= FindDocument %>, variables: { id } })
      .then(res => toHttpResponse(res).data);
  }

  public retrieve(req?: any): Promise<any> {
    return client.query({ query: <%= GetDocument%>, variables: buildPaginationOptions(req), fetchPolicy: req?.bypassCache ? 'no-cache' : 'cache-first' })
      .then(res => toPagedHttpResponse(res));
  }

  public delete(_id: any) : Promise<any> {
    const id = this.getId(_id);
    return client.mutate({ mutation: <%= DeleteDocument %>, variables: { id } })
      .then(res => toHttpResponse(res).data);
  }

  public create(<%= entityInstance %>: I<%= entityAngularName %>): Promise<I<%= entityAngularName %>> {
    return client.mutate({ mutation: <%= CreateDocument %>, variables: { <%= entityInstance %> } })
      .then(res => toHttpResponse(res).data);
  }

  public update(<%= entityInstance %>: I<%= entityAngularName %>): Promise<I<%= entityAngularName %>> {
    return client.mutate({ mutation: <%= UpdateDocument %>, variables: { <%= entityInstance %> } })
      .then(res => toHttpResponse(res).data);
  }

  public partialUpdate(<%= entityInstance %>: I<%= entityAngularName %>): Promise<I<%= entityAngularName %>> {
    return client.mutate({ mutation: <%= UpdateDocument %>, variables: { <%= entityInstance %> } })
      .then(res => toHttpResponse(res).data);
  }

  private getId(id: any): <%= pkType %> {
    <%_ if(pkType === 'number') { _%>
    return parseInt(id, 10);
    <%_ } else { _%>
    return id;
    <% } _%>
  }
}
