private org.apache.cxf.jaxrs.client.Client client;

{{#each @root/securitySchemes}}
{{#ifeq type 'apiKey'}}
private java.lang.String {{{identifier name}}}Authorization;
{{/ifeq}}
{{#ifeq type 'http'}}
{{#ifeq scheme 'basic'}}
private java.lang.String {{{identifier name}}}Username;
private java.lang.String {{{identifier name}}}Password;
{{else}}
private java.lang.String {{{identifier name}}}Authorization;
{{/ifeq}}
{{/ifeq}}
{{#or (ifeq type 'oauth2') (ifeq type 'openIdConnect')}}
private java.lang.String {{{identifier name}}}Authorization;
{{/or}}
{{/each}}

public {{className name}}ApiImpl() {
	this({{apiPackage}}.ApiConstants.DEFAULT_SERVER, {{apiPackage}}.ApiProviders.defaultProviders());
}

public {{className name}}ApiImpl(java.lang.String baseAddress) {
	this(baseAddress, {{apiPackage}}.ApiProviders.defaultProviders());
}

public {{className name}}ApiImpl(java.lang.String baseAddress, java.util.List<?> providers) {
	this(org.apache.cxf.jaxrs.client.JAXRSClientFactory.create(baseAddress, {{@root.apiSpecPackage}}.{{className name}}ApiSpec.class, providers));
}

public {{className name}}ApiImpl({{@root.apiSpecPackage}}.{{className name}}ApiSpec api) {
	this(api, org.apache.cxf.jaxrs.client.WebClient.client(api));
}

public {{className name}}ApiImpl({{@root.apiSpecPackage}}.{{className name}}ApiSpec api, org.apache.cxf.jaxrs.client.Client client) {
	this.api = api;
	this.client = client;

	setConnectionTimeout({{apiPackage}}.ApiConstants.DEFAULT_CONNECTION_TIMEOUT_MILLIS);
	setReceiveTimeout({{apiPackage}}.ApiConstants.DEFAULT_RECEIVE_TIMEOUT_MILLIS);
}

{{#each @root/securitySchemes}}
{{#if (and @first @last)}}
{{#set '__securitySchemeName'}}
{{/set}}
{{else}}
{{#set '__securitySchemeName'}}
{{{className name}}}
{{/set}}
{{/if}}
{{#ifeq type 'apiKey'}}
public void authorize{{{__securitySchemeName}}}(java.lang.String apiKeyValue) {
	this.{{{identifier name}}}Authorization = apiKeyValue;
{{#ifeq in 'header'}}
	client.header({{{stringLiteral paramName}}}, apiKeyValue);
{{else ifeq in 'cookie'}}
	client.cookie(new javax.ws.rs.core.Cookie({{{stringLiteral paramName}}}, apiKeyValue));
{{else ifeq in 'query'}}
	client.query({{{stringLiteral paramName}}}, apiKeyValue);
{{/ifeq}}
}

@java.lang.Override
public java.lang.String get{{{__securitySchemeName}}}Authorization() {
	return {{{identifier name}}}Authorization;
}
{{/ifeq}}
{{#ifeq type 'http'}}
{{#ifeq scheme 'basic'}}
public void authorize{{{__securitySchemeName}}}(java.lang.String username, java.lang.String password) {
	this.{{{identifier name}}}Username = username;
	this.{{{identifier name}}}Password = password;
	client.authorization("Basic " + java.util.Base64.getEncoder().encodeToString((username + ":" + password).getBytes(java.nio.charset.StandardCharsets.UTF_8)));
}

@java.lang.Override
public java.lang.String get{{#if __securitySchemeName}}{{{__securitySchemeName}}}{{else}}Authorization{{/if}}Username() {
	return {{{identifier name}}}Username;
}

@java.lang.Override
public java.lang.String get{{#if __securitySchemeName}}{{{__securitySchemeName}}}{{else}}Authorization{{/if}}Password() {
	return {{{identifier name}}}Password;
}
{{else}}
@java.lang.Override
public void authorize{{{__securitySchemeName}}}(java.lang.String value) {
	this.{{{identifier name}}}Authorization = value;
	client.authorization({{{stringLiteral (concat (capitalize scheme) ' ')}}} + value);
}

@java.lang.Override
public java.lang.String get{{{__securitySchemeName}}}Authorization() {
	return {{{identifier name}}}Authorization;
}
{{/ifeq}}
{{/ifeq}}
{{#or (ifeq type 'oauth2') (ifeq type 'openIdConnect')}}
@java.lang.Override
public void authorize{{{__securitySchemeName}}}(java.lang.String bearerToken) {
	this.{{{identifier name}}}Authorization = bearerToken;
	client.authorization("Bearer " + bearerToken);
}

@java.lang.Override
public java.lang.String get{{{__securitySchemeName}}}Authorization() {
	return {{{identifier name}}}Authorization;
}
{{/or}}

{{/each}}
@java.lang.Override
public org.apache.cxf.jaxrs.client.Client client() {
	return client;
}

@java.lang.Override
public long getConnectionTimeout() {
	return org.apache.cxf.jaxrs.client.WebClient.getConfig(client).getHttpConduit().getClient().getConnectionTimeout();
}

public void setConnectionTimeout(long connectionTimeout) {
	org.apache.cxf.jaxrs.client.WebClient.getConfig(client).getHttpConduit().getClient().setConnectionTimeout(connectionTimeout);
}

@java.lang.Override
public long getReceiveTimeout() {
	return org.apache.cxf.jaxrs.client.WebClient.getConfig(client).getHttpConduit().getClient().getReceiveTimeout();
}

public void setReceiveTimeout(long receiveTimeout) {
	org.apache.cxf.jaxrs.client.WebClient.getConfig(client).getHttpConduit().getClient().setReceiveTimeout(receiveTimeout);
}

