{{=<% %>=}}
/* tslint:disable */
import {HttpClient, HttpHeaders, HttpParams<%#importHttpResponse%>, HttpResponse<%/importHttpResponse%>} from '@angular/common/http';
import {Injectable} from '@angular/core';
import {Observable} from 'rxjs';
import {EndpointReference} from './decorators';
import {<%#refs%><%name%><%^last%>, <%/last%><%/refs%>} from './models';
<%#hasRefType%>
import {Ref} from './ref.type';
<%/hasRefType%>

@Injectable()
export class <%&name%>Api {
    private domain: string;

    constructor(private http: HttpClient){
        <%#domain%>
        this.domain = '<%&.%>';
        <%/domain%>
        <%^domain%>
        this.domain = '.';
        <%/domain%>
    }
<%#methods%>

    /**
    <%#summaryLines%>
     * <%&.%>
    <%/summaryLines%>
     *
     * @method
     * @name <%&methodName%>
    <%#parameters%>
     <%^isSingleton%>* @param <%&camelCaseName%> - <%&description%><%/isSingleton%>
    <%/parameters%>
    <%#hasOptionalParameters%>
     * @param opts
    <%/hasOptionalParameters%>
     * @return <%&typescriptReturnType%>
     */
    @EndpointReference('<%&method%> <%&path%>')
    public <%&methodName%>(<%#parameters%><%&camelCaseName%>: <%&typescriptType%><%#default%> = <%&default%><%/default%><%^last%>, <%/last%><%/parameters%><%#hasOptionalParameters%>opts?: {<%#optionalParameters%><%&camelCaseName%>?: <%&typescriptType%><%#default%> = <%&default%><%/default%><%^last%>, <%/last%><%/optionalParameters%>}<%/hasOptionalParameters%>): Observable<<%&typescriptReturnType%>> {
        let queryParameters = new HttpParams();
        let headers = new HttpHeaders();
        headers = headers.set('Content-Type', '<%&contentType%>');
    <%#allParameters%>
        <%#isQueryParameter%>
            <%#isSingleton%>
        queryParameters = queryParameters.set('<%&name%>', '<%&singleton%>');
            <%/isSingleton%>
            <%^isSingleton%>
                <%#isPatternType%>
        Object.keys(parameters).forEach(function(parameterName) {
            if(new RegExp('<%&pattern%>').test(parameterName)){
                queryParameters = queryParameters.set(parameterName, parameters[parameterName]);
            }
        });
                <%/isPatternType%>
                <%^isPatternType%>
                    <%#isRequired%>
                        <%^isArray%>
        queryParameters = queryParameters.set('<%&name%>', String(<%&camelCaseName%>));
                        <%/isArray%>
                        <%#isArray%>
        for(const _<%&camelCaseName%>Element_ of <%&camelCaseName%>) {
            queryParameters = queryParameters.append('<%&name%>', String(_<%&camelCaseName%>Element_));
        }
                        <%/isArray%>
                    <%/isRequired%>
                    <%^isRequired%>
        if(opts !== undefined && opts.<%&camelCaseName%> !== undefined){
                        <%^isArray%>
            queryParameters = queryParameters.set('<%&name%>', String(opts.<%&camelCaseName%>));
                        <%/isArray%>
                        <%#isArray%>
            for(const _<%&camelCaseName%>Element_ of opts.<%&camelCaseName%>) {
                queryParameters = queryParameters.append('<%&name%>', String(_<%&camelCaseName%>Element_));
            }
                        <%/isArray%>
        }
                    <%/isRequired%>
                <%/isPatternType%>
            <%/isSingleton%>
        <%/isQueryParameter%>
        <%#isHeaderParameter%>
            <%#isSingleton%>
        headers = headers.set('<%&name%>', '<%&singleton%>');
            <%/isSingleton%>
            <%^isSingleton%>
                <%#isRequired%>
                    <%^isArray%>
        headers = headers.set('<%&name%>', String(<%&camelCaseName%>));
                    <%/isArray%>
                    <%#isArray%>
        for(const _<%&camelCaseName%>Element_ of <%&camelCaseName%>) {
            headers = headers.append('<%&name%>', String(_<%&camelCaseName%>Element_));
        }
                    <%/isArray%>
                <%/isRequired%>
                <%^isRequired%>
        if(<%&camelCaseName%> !== undefined){
                    <%^isArray%>
            headers = headers.set('<%&name%>', String(<%&camelCaseName%>));
                    <%/isArray%>
                    <%#isArray%>
            for(const _<%&camelCaseName%>Element_ of <%&camelCaseName%>) {
                headers = headers.append('<%&name%>', String(_<%&camelCaseName%>Element_));
            }
                    <%/isArray%>
        }
                <%/isRequired%>
            <%/isSingleton%>
        <%/isHeaderParameter%>
        <%#isFormParameter%>
            <%#isSingleton%>
        form['<%&name%>'] = '<%&singleton%>';
            <%/isSingleton%>
            <%^isSingleton%>
                <%#isRequired%>
        form['<%&name%>'] = <%&camelCaseName%>;
                <%/isRequired%>
                <%^isRequired%>
        if(<%&camelCaseName%> !== undefined){
            form['<%&name%>'] = <%&camelCaseName%>;
        }
                <%/isRequired%>
            <%/isSingleton%>
        <%/isFormParameter%>
    <%/allParameters%>

        const uri = `<%&backTickPath%>`;

        return this.http
            .<%angular2httpMethod%><%^responseType%><<%&typescriptReturnType%>><%/responseType%>(this.domain + uri<%#hasPayload%><%#parameters%><%#isBodyParameter%>, <%&camelCaseName%><%/isBodyParameter%><%/parameters%><%/hasPayload%>,
            { headers: headers, params: queryParameters<%#responseType%>, responseType: '<%&.%>'<%/responseType%><%#observeResponse%>, observe: 'response'<%/observeResponse%> });
    }
<%/methods%>

}
