
/* <%- tplJsOrTs('eslint quotes: 0', 'tslint:disable:quotemark') %> */
// Validation definitions for validateSchema hook for service `<%= serviceName %>`. (Can be re-generated.)
<%- tplImports('{ validateSchema }', 'feathers-hooks-common') %>
<%- tplImports('merge', 'lodash.merge', 'req') %>
<%- tplImports('ajv', null, 'req') %>
<%- insertFragment('imports') %>
<%- insertFragment('init') %>

<%- insertFragment('set_id_type', [
  `// ${lintDisableNextLineUnused}`,
  `const ID = '${primaryKey.idType === 'number' ? 'integer' : primaryKey.idType}'${sc}`,
]) %>

let base = merge({},
<% __jsonSchema = merge({}, feathersSpecs[serviceName]);
   delete __jsonSchema._extensions;
   __str = stringifyPlus(__jsonSchema).replace(/"ID"/g, 'ID')
     .split('\n').map(str => `  ${str}`).join('\n');
-%>
  <%- insertFragment('base', Object.keys(__jsonSchema).length === 0 ? undefined : `${__str},`) %>
  <%- insertFragment('base_more') %>
)<%- sc %>
<%- insertFragment('base_change') %>

let create = merge({},
  base,
  <%- insertFragment('create_more') %>
)<%- sc %>

let update = merge({},
  base,
  <%- insertFragment('update_more') %>
)<%- sc %>

let patch = merge({},
  base,
  <%- insertFragment('patch_more') %>
)<%- sc %>
delete patch.required<%- sc %>
<%- insertFragment('all_change') %>

let validateCreate = <%- tplJsOrTs('options', '(options?: any)') %> => {
  <%- insertFragment('func_create', [
    `  return validateSchema(create, ajv, options)${sc}`,
  ]) %>
}<%- sc %>

let validateUpdate = <%- tplJsOrTs('options', '(options?: any)') %> => {
  <%- insertFragment('func_update', [
    `  return validateSchema(update, ajv, options)${sc}`,
  ]) %>
}<%- sc %>

let validatePatch = <%- tplJsOrTs('options', '(options?: any)') %> => {
  <%- insertFragment('func_patch', [
    `  return validateSchema(patch, ajv, options)${sc}`,
  ]) %>
}<%- sc %>

let quickValidate = <%- tplJsOrTs('(method, data, options)', '(method: string, data: any, options?: any)') %> => {
  try {
    if (method === 'create') { validateCreate(options)({ type: 'before', method: 'create', data }<%- tplTsOnly(' as any') -%>)<%- sc %> }
    if (method === 'update') { validateCreate(options)({ type: 'before', method: 'update', data }<%- tplTsOnly(' as any') -%>)<%- sc %> }
    if (method === 'patch') { validateCreate(options)({ type: 'before', method: 'patch', data }<%- tplTsOnly(' as any') -%>)<%- sc %> }
  } catch (err) {
    return err<%- sc %>
  }
}<%- sc %>
<%- insertFragment('validate_change') %>

<%- tplTsOnly(['// tslint:disable:trailing-comma', '']) -%>
let moduleExports = {
  create,
  update,
  patch,
  validateCreate,
  validateUpdate,
  validatePatch,
  quickValidate,
  <%- insertFragment('moduleExports') %>
}<%- sc %>

<%- insertFragment('exports') %>
<%- `${tplExport('moduleExports')}${sc}` %>

<%- insertFragment('funcs') %>
<%- insertFragment('end') %>
