/* eslint-disable camelcase,@typescript-eslint/no-unused-vars */
{{#if disclaimer}}// {{{ disclaimer }}}{{#if header}}
{{{header}}}{{/if}}{{/if}}

import { H3Event } from "h3";{{#if typeDef.apiConfig.lookup.hasValidate}}
import { {{Name}}TypeDef } from "{{typeDefPackage}}";{{/if}}{{#if singletonDefaultImport}}
import { {{singletonDefault}} } from "{{singletonDefaultImport}}";{{/if}}

export default defineEventHandler(async (event: H3Event) => {
  return await filterErrors(event, "{{name}}.lookup", async (event: H3Event) => {{{curlyOpen}}}{{#if typeDef.apiConfig.lookup.permission.admin}}
    return await requireAdminAccountObject(event, "{{name}}.lookup", async (event: H3Event, session, account) => {{{curlyOpen}}}{{else}}{{#if typeDef.apiConfig.lookup.permission.owner}}
    return await requireAccountObject(event, "{{name}}.lookup", async (event: H3Event, session, account) => {{{curlyOpen}}}{{else}}{{#if typeDef.apiConfig.lookup.permission.session}}
    return await requireAccount(event, "{{name}}.lookup", async (event: H3Event, session) => {{{curlyOpen}}}{{/if}}{{/if}}{{/if}}
      const {{name}}Repo = {{name}}Repository();
      const id ={{#if typeDef.singleton}} "{{typeDef.singleton}}"; // {{name}} is a singleton: there can be only one, with id "{{typeDef.singleton}}"{{else}}event?.context?.params?.id;{{/if}}
      if (!id) throw notFound({{name}}Repo.typeDef.idFieldName());{{#if typeDef.apiConfig.lookup.hasValidate}}
      if (typeof {{Name}}TypeDef.apiConfig.lookup?.validate === "function") {
        const validated = await {{Name}}TypeDef.apiConfig.lookup.validate(account, id);
        if (validated === true || (typeof validated === "object" && Object.keys(validated).length === 0)) {
          // successfully validated
        } else if (typeof validated === "object" && Object.keys(validated).length > 0) {
          throw validationError(validated);
        } else {
          throw validationError({global: ["validation"]});
        }
      }{{/if}}
      const {{name}}_by_id = await {{name}}Repo.safeFindById(id);
      if ({{name}}_by_id) return {{name}}_by_id;
      {{#each typeDef.alternateLookupFields}}
      const {{../name}}_by_{{this}} = await {{../name}}Repo.safeFindFirstBy("{{this}}", id);
      if ({{../name}}_by_{{this}}) return {{../name}}_by_{{this}};
      {{/each}}
      {{#if singletonDefault}}return {{singletonDefault}}{{else}}throw notFound(id){{/if}};{{#if typeDef.apiConfig.lookup.permission.admin}}
    });{{else}}{{#if typeDef.apiConfig.lookup.permission.owner}}
    });{{else}}{{#if typeDef.apiConfig.lookup.permission.session}}
    });{{/if}}{{/if}}{{/if}}
  });
});
