{{#if disclaimer}}// {{{ disclaimer }}}{{#if header}}
{{{header}}}{{/if}}{{/if}}

import { Ref } from "vue";
import { MobilettoOrmObject, MobilettoOrmPurgeResults, MobilettoOrmValidationErrors } from "mobiletto-orm-typedef";
import { {{ Name }}Type, {{ Name }}TypeDef } from "{{typeDefPackage}}";
import * as a from "{{utilsPath}}/serviceHelper.js";

export const {{ name }}Service = {
  search{{ Name }},
  find{{ Name }},
  create{{ Name }},
  update{{ Name }},
  delete{{ Name }},
};

function search{{ Name }}(query?: MobilettoOrmFindApiOpts): Promise<{{ Name }}Type[]> {
  return $fetch("/api/model/{{ name }}", a.authPostJson(query)).then(a.handleJsonResponse<{{ Name }}Type[]>);
}

function find{{ Name }}(
  id: string,
  serverErrors: Ref<MobilettoOrmValidationErrors>,
): Promise<{{ Name }}Type> {
  return $fetch(`/api/model/{{ name }}/${id}`, a.authGet())
    .then(a.handleJsonResponse<{{ Name }}Type>)
    .catch(a.handleErrors(serverErrors)) as Promise<{{Name}}Type>;
}

function create{{ Name }}(
  {{ name }}: {{ Name }}Type,
  serverErrors: Ref<MobilettoOrmValidationErrors>,
): Promise<{{ Name }}Type> {
  const id = {{ Name }}TypeDef.id({{ name }});
  return $fetch(`/api/model/{{ name }}/${{{curlyOpen}}}id{{{curlyClose}}}`, a.authPutJson({{ name }}))
    .then(a.handleJsonResponse<{{ Name }}Type>)
    .catch(a.handleErrors(serverErrors)) as Promise<{{Name}}Type>;
}

function update{{ Name }}(
  {{ name }}: {{ Name }}Type,
  serverErrors: Ref<MobilettoOrmValidationErrors>,
): Promise<{{ Name }}Type> {
  const id = {{ Name }}TypeDef.id({{ name }});
  return $fetch(`/api/model/{{ name }}/${{{curlyOpen}}}id{{{curlyClose}}}`, a.authPatchJson({{ name }}))
    .then(a.handleJsonResponse<{{ Name }}Type>)
    .catch(a.handleErrors(serverErrors)) as Promise<{{Name}}Type>;
}

function delete{{ Name }}(
  id: string,
  serverErrors: Ref<MobilettoOrmValidationErrors>,
  purge?: boolean
): Promise<MobilettoOrmObject | MobilettoOrmPurgeResults> {
  return $fetch(`/api/model/{{ name }}/${id}/${purge ? `?purge=${purge}` : ""}`, a.authDelete())
    .then(a.handleJsonResponse<MobilettoOrmObject | MobilettoOrmPurgeResults>)
    .catch(a.handleErrors(serverErrors)) as Promise<{{Name}}Type>;
}
