package {{package}};

{{#imports}}
import {{import}};
{{/imports}}

import io.micrometer.core.annotation.Timed;
import io.micrometer.core.aop.MeterTag;

import java.util.Map;
import java.util.List;

import java.io.InputStream;

import jakarta.annotation.Nonnull;
import jakarta.annotation.security.RolesAllowed;

import {{javaxPackage}}.ws.rs.Consumes;
import {{javaxPackage}}.ws.rs.Produces;
import {{javaxPackage}}.ws.rs.DELETE;
import {{javaxPackage}}.ws.rs.GET;
import {{javaxPackage}}.ws.rs.HEAD;
import {{javaxPackage}}.ws.rs.PATCH;
import {{javaxPackage}}.ws.rs.POST;
import {{javaxPackage}}.ws.rs.PUT;
import {{javaxPackage}}.ws.rs.Path;
import {{javaxPackage}}.ws.rs.DefaultValue;
import {{javaxPackage}}.ws.rs.PathParam;
import {{javaxPackage}}.ws.rs.HeaderParam;
import {{javaxPackage}}.ws.rs.QueryParam;
import {{javaxPackage}}.ws.rs.FormParam;
import {{javaxPackage}}.ws.rs.core.Response;
import {{javaxPackage}}.servlet.http.HttpServletRequest;
import {{javaxPackage}}.servlet.http.HttpServletResponse;
import {{javaxPackage}}.ws.rs.core.Context;
import {{javaxPackage}}.ws.rs.core.SecurityContext;

import {{javaxPackage}}.inject.Inject;

import org.apache.polaris.core.context.RealmContext;

import org.eclipse.microprofile.faulttolerance.Timeout;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

{{#useBeanValidation}}
import {{javaxPackage}}.validation.constraints.*;
import {{javaxPackage}}.validation.Valid;
{{/useBeanValidation}}
{{#operations}}{{#operation}}{{#isMultipart}}import org.jboss.resteasy.plugins.providers.multipart.MultipartFormDataInput;
{{/isMultipart}}{{/operation}}{{/operations}}
{{!
Note that this template is copied /modified from
https://github.com/OpenAPITools/openapi-generator/blob/783e68c7acbbdcbb2282d167d1644b069f12d486/modules/openapi-generator/src/main/resources/JavaJaxRS/resteasy/api.mustache
It is updated to remove all swagger annotations
}}
/**
 * The {{{baseName}}} API interface
 *
 * This file is automatically generated by the OpenAPI Code Generator based on configuration in the
 * build.gradle file.
 *
 */
@Path("{{contextPath}}{{commonPath}}"){{#hasConsumes}}
@Consumes({ {{#consumes}}"{{{mediaType}}}"{{^-last}}, {{/-last}}{{/consumes}} }){{/hasConsumes}}{{#hasProduces}}
@Produces({ {{#produces}}"{{{mediaType}}}"{{^-last}}, {{/-last}}{{/produces}} }){{/hasProduces}}
{{>generatedAnnotation}}
{{#operations}}
public class {{classname}}  {
  private static final Logger LOGGER = LoggerFactory.getLogger({{classname}}.class);

  private final {{classname}}Service service;

  @Inject
  public {{classname}}({{classname}}Service service) {
    this.service = service;
  }

{{#operation}}
  /**
   * {{^notes}}{{{summary}}}{{/notes}}{{notes}}
   *
   * Response type: {@code {{{returnBaseType}}}}.
   *{{#allParams}} @param {{paramName}} {{#required}}Required -{{/required}} {{description}}
   *{{/allParams}}{{#responses}}
   * @return {{{code}}} - {{{message}}}{{/responses}}
   */
  @{{httpMethod}}{{#subresourceOperation}}
  @Path("{{{path}}}"){{/subresourceOperation}}{{#hasConsumes}}
  @Consumes({ {{#consumes}}"{{{mediaType}}}"{{^-last}}, {{/-last}}{{/consumes}} }){{/hasConsumes}}{{#hasProduces}}
  @Produces({ {{#produces}}"{{{mediaType}}}"{{^-last}}, {{/-last}}{{/produces}} }){{/hasProduces}}{{#hasAuthMethods}}
  {{#authMethods}}{{#isOAuth}}@RolesAllowed("**"){{/isOAuth}}{{/authMethods}}{{/hasAuthMethods}}
  @Timed("{{metricsPrefix}}.{{baseName}}.{{nickname}}")
  @Timeout
  public Response {{nickname}}({{#isMultipart}}MultipartFormDataInput input,{{/isMultipart}}{{#allParams}}{{>queryParams}}{{>pathParams}}{{>headerParams}}{{>bodyParams}}{{^isMultipart}}{{>formParams}},{{/isMultipart}}{{#isMultipart}}{{^isFormParam}},{{/isFormParam}}{{/isMultipart}}{{/allParams}}@Context @MeterTag(key="realm_id",expression="realmIdentifier") RealmContext realmContext,@Context @MeterTag(key="principal",expression="userPrincipal") SecurityContext securityContext) {
{{! Don't log form or header params in case there are secrets, e.g., OAuth tokens }}
    LOGGER.atDebug().setMessage("Invoking {{baseName}} with params")
      .addKeyValue("operation", "{{nickname}}"){{#allParams}}{{^isHeaderParam}}{{^isFormParam}}
      .addKeyValue("{{paramName}}", {{^isBodyParam}}{{paramName}}{{/isBodyParam}}{{#isBodyParam}}String.valueOf({{paramName}}){{/isBodyParam}}){{/isFormParam}}{{/isHeaderParam}}{{/allParams}}
      .log();

    Response ret =
      service.{{nickname}}({{#isMultipart}}input,{{/isMultipart}}{{#allParams}}{{^isMultipart}}{{paramName}},{{/isMultipart}}{{#isMultipart}}{{^isFormParam}}{{paramName}},{{/isFormParam}}{{/isMultipart}}{{/allParams}}realmContext,securityContext);
    LOGGER.debug("Completed execution of {{nickname}} API with status code {}", ret.getStatus());
    return ret;
  }
{{/operation}}
}
{{/operations}}
