<%_
const pkType = getPkType(databaseType) === 'Long' ? 'number' : 'string';
const graphQLImport = clientFramework === 'vue' ? '@/graphql' : 'app/graphql';
const typesImport = clientFramework === 'vue' ? '@/graphql/graphql.common-types' : 'app/graphql/graphql.common-types';
_%>
<%_ if (clientFramework === 'angularX') {  %>
import { Injectable } from '@angular/core';
import * as Apollo from 'apollo-angular';
<%_ } %>
import { ArgsType, Field, ObjectType, buildQuery, buildMutation } from 'graphql-typeop';
import { Create<%= entityClass %>ArgsImpl, Mutation, MutationCreate<%= entityClass %>Args, MutationDelete<%= entityClass %>Args, MutationUpdate<%= entityClass %>Args, Paginated<%= entityClass %>, <%= entityClass %>, <%= entityClass %>Edge, Query, QueryGet<%= entityClass %>Args, Update<%= entityClass %>ArgsImpl } from '<%= graphQLImport %>';
import { Base<%= entityClass %>, Detail<%= entityClass %>, PaginationVars } from '<%= typesImport %>';

@ArgsType()
class Get<%= entityClass %>Vars implements QueryGet<%= entityClass %>Args {
  id!: <%= pkType %>;
}

@ObjectType()
class Get<%= entityClass %>Query {
  @Field<Query, Get<%= entityClass %>Vars>({aliasFor: 'get<%= entityClass %>'})
  result!: Detail<%= entityClass %>;
}

@ArgsType()
class Get<%= entityNamePlural %>Vars extends PaginationVars {}

@ObjectType()
class <%= entityClass %>EdgeResult implements Partial<<%= entityClass %>Edge> {
  node!: Detail<%= entityClass %>;
}

@ObjectType()
class Get<%= entityNamePlural %>Result implements Partial<Paginated<%= entityClass %>> {
  edges!: <%= entityClass %>EdgeResult[];
  totalCount?: number;
}

@ObjectType()
class Get<%= entityNamePlural %>Query {
  @Field<Query, Get<%= entityNamePlural %>Vars>({aliasFor: 'get<%= entityNamePlural %>'})
  result!: Get<%= entityNamePlural %>Result;
}

@ArgsType()
export class Create<%= entityClass %>Vars implements MutationCreate<%= entityClass %>Args {
  <%= entityInstance %>!: Create<%= entityClass %>ArgsImpl;
}

@ObjectType()
class Create<%= entityClass %>Mutation {
  @Field<Mutation, Create<%= entityClass %>Vars>({aliasFor: 'create<%= entityClass %>'})
  result!: Detail<%= entityClass %>;
}

@ArgsType()
export class Update<%= entityClass %>Vars implements MutationUpdate<%= entityClass %>Args {
  <%= entityInstance %>!: Update<%= entityClass %>ArgsImpl;
}

@ObjectType()
class Update<%= entityClass %>Mutation {
  @Field<Mutation, Update<%= entityClass %>Vars>({aliasFor: 'update<%= entityClass %>'})
  result!: Detail<%= entityClass %>;
}

@ArgsType()
class Delete<%= entityClass %>Vars implements MutationDelete<%= entityClass %>Args {
  id!: <%= pkType %>;
}

@ObjectType()
class Delete<%= entityClass %>Mutation {
  @Field<Mutation, Get<%= entityClass %>Vars>({aliasFor: 'delete<%= entityClass %>'})
  result!: number;
}

export const Get<%= entityClass %>Document = buildQuery(Get<%= entityClass %>Query, Get<%= entityClass %>Vars);
export const Get<%= entityNamePlural %>Document = buildQuery(Get<%= entityNamePlural %>Query, Get<%= entityNamePlural %>Vars);
export const Create<%= entityClass %>Document = buildMutation(Create<%= entityClass %>Mutation, Create<%= entityClass %>Vars)
export const Update<%= entityClass %>Document = buildMutation(Update<%= entityClass %>Mutation, Update<%= entityClass %>Vars)
export const Delete<%= entityClass %>Document = buildMutation(Delete<%= entityClass %>Mutation, Delete<%= entityClass %>Vars)

<%_ if (clientFramework === 'angularX') {  %>
@Injectable({ providedIn: 'root'})
export class Get<%= entityClass %>GQL extends Apollo.Query<Get<%= entityClass %>Query, Get<%= entityClass %>Vars> {
  document = Get<%= entityClass %>Document;

  constructor(apollo: Apollo.Apollo) {
    super(apollo)
  }
}

@Injectable({ providedIn: 'root'})
export class Get<%= entityNamePlural %>GQL extends Apollo.Query<Get<%= entityNamePlural %>Query, Get<%= entityNamePlural %>Vars> {
  document = Get<%= entityNamePlural %>Document;

  constructor(apollo: Apollo.Apollo) {
    super(apollo);
  }
}

@Injectable({ providedIn: 'root'})
export class Create<%= entityClass %>GQL extends Apollo.Mutation<Create<%= entityClass %>Mutation, Create<%= entityClass %>Vars> {
  document = Create<%= entityClass %>Document;

  constructor(apollo: Apollo.Apollo) {
    super(apollo);
  }
}

@Injectable({ providedIn: 'root'})
export class Update<%= entityClass %>GQL extends Apollo.Mutation<Update<%= entityClass %>Mutation, Update<%= entityClass %>Vars> {
  document = Update<%= entityClass %>Document;

  constructor(apollo: Apollo.Apollo) {
    super(apollo);
  }
}

@Injectable({ providedIn: 'root'})
export class Delete<%= entityClass %>GQL extends Apollo.Mutation<Delete<%= entityClass %>Mutation, Delete<%= entityClass %>Vars> {
  document = Delete<%= entityClass %>Document;

  constructor(apollo: Apollo.Apollo) {
    super(apollo);
  }
}
<%_ } %>

const usedClasses = [ Create<%= entityClass %>ArgsImpl, Update<%= entityClass %>ArgsImpl ];
