import { Injectable } from '@angular/core';
import { Observable } from 'rxjs/Observable';
import { TransferEnviromentService } from './transferEnviroment.service';
import { IEnviroment } from '../interfaces/ienviroment';

{{=<% %>=}}
<%#flatImports%>
<%#imports%>
import { <%name%> } from <%={{ }}=%>'{{{from}}}{{{file}}}'{{=<% %>=}};
<%/imports%>
<%/flatImports%>
<%={{ }}=%>

{{#flatPaths}}
/**
 * @name I{{pascalName}}
 *
 {{#data.parameters.sortedParameters.path.true}}
 * @param *{{name}} - {{{description}}} {{#items.enum.length}}[{{items.enum}}]{{/items.enum.length}}
 {{/data.parameters.sortedParameters.path.true}}
 {{#data.parameters.sortedParameters.body.true}}
 * @param *{{name}} - {{{description}}} {{#items.enum.length}}[{{items.enum}}]{{/items.enum.length}} 
 {{/data.parameters.sortedParameters.body.true}}
 {{#data.parameters.sortedParameters.query.true}}
 * @param *{{name}} - {{{description}}} {{#items.enum.length}}[{{items.enum}}]{{/items.enum.length}}
 {{/data.parameters.sortedParameters.query.true}}
 {{#data.parameters.sortedParameters.formData.true}}
 * @param *{{name}} - {{{description}}} {{#items.enum.length}}[{{items.enum}}]{{/items.enum.length}}
 {{/data.parameters.sortedParameters.formData.true}}
 {{#data.parameters.sortedParameters.body.false}}
 * @param {{name}} - {{{description}}} {{#items.enum.length}}[{{items.enum}}]{{/items.enum.length}}
 {{/data.parameters.sortedParameters.body.false}}
 {{#data.parameters.sortedParameters.query.false}}
 * @param {{name}} - {{{description}}} {{#items.enum.length}}[{{items.enum}}]{{/items.enum.length}}
 {{/data.parameters.sortedParameters.query.false}}
 {{#data.parameters.sortedParameters.formData.false}}
 * @param {{name}} - {{{description}}} {{#items.enum.length}}[{{items.enum}}]{{/items.enum.length}}
 {{/data.parameters.sortedParameters.formData.false}}
 */
export interface I{{pascalName}} {
    {{#data.parameters.sortedParameters.path.true}}
    {{name}}: {{type}};
    {{/data.parameters.sortedParameters.path.true}}
    {{#data.parameters.sortedParameters.body.true}}
    {{name}}: {{type}};
    {{/data.parameters.sortedParameters.body.true}}
    {{#data.parameters.sortedParameters.query.true}}
    {{name}}: {{type}};
    {{/data.parameters.sortedParameters.query.true}}
    {{#data.parameters.sortedParameters.formData.true}}
    {{name}}: {{type}};
    {{/data.parameters.sortedParameters.formData.true}}
    {{#data.parameters.sortedParameters.body.false}}
    {{name}}?: {{type}};
    {{/data.parameters.sortedParameters.body.false}}
    {{#data.parameters.sortedParameters.query.false}}
    {{name}}?: {{type}};
    {{/data.parameters.sortedParameters.query.false}}
    {{#data.parameters.sortedParameters.formData.false}}
    {{name}}?: {{type}};
    {{/data.parameters.sortedParameters.formData.false}}
}

{{/flatPaths}}


@Injectable()
export class {{ServiceName}} {
    private enviroment: IEnviroment;
    constructor(private base: BaseService, private enviromentService: TransferEnviromentService) { 
        this.enviroment = enviromentService.getEnviroment();
    }

    {{#flatPaths}}
    /**
     * {{{data.description}}}
     * @method
     * @name {{name}}
     * @param data - объект с данными типа I{{pascalName}}
     * @param form - не обазательный параметр, ссылка на форму, для подсветки ошибок
     */
    public {{name}}(
        data: I{{pascalName}},
        form?: any
    ): Observable<any> {
        {{=<% %>=}}
        const path = ((typeof this.enviroment.host !== 'undefined') ? this.enviroment.host : '') +
        <%#data.parameters.sortedParameters.path.true%>        
        <%={{ }}=%>'{{{basePath}}}{{{data.url}}}'{{=<% %>=}}
        .replace(/{<%name%>}/ig, (typeof data.<%name%> !== 'string')
         ? JSON.stringify(data.<%name%>)
         : data.<%name%>);
        <%/data.parameters.sortedParameters.path.true%>
        <%^data.parameters.sortedParameters.path.true%>        
        <%={{ }}=%>'{{{basePath}}}{{{data.url}}}'{{=<% %>=}};
        <%/data.parameters.sortedParameters.path.true%>
        <%={{ }}=%>
        const headers: Array<{name: string, value: string | string[]}> = [];
        headers.push({name: 'Access-Control-Allow-Origin', value: '*'});       
        {{#data.parameters.sortedParameters.header.true}}
        headers.push({name: '{{name}}', value: '{{enum}}'});
        {{/data.parameters.sortedParameters.header.true}}
        headers.push({name: 'X-JWT-Token', value: (this.enviromentService.getToken() || '')});
        const search: Array<{param: string, value: string}> = [];
        {{#data.parameters.sortedParameters.query.true}}
        if (Array.isArray(data.{{name}})) {
            data.{{name}}.forEach((item) => {
                search.push({param: '{{name}}[]', value: '' + item});
            });
        } else {
            search.push({param: '{{name}}', value: '' + data.{{name}}});
        }
        {{/data.parameters.sortedParameters.query.true}}
        {{#data.parameters.sortedParameters.query.false}}
        if (typeof data.{{name}} !== 'undefined' && data.{{name}} !== null ) {
            if (Array.isArray(data.{{name}})) {
                data.{{name}}.map((item) => {
                    search.push({param: '{{name}}[]', value: '' + item});
                });
            } else {
                search.push({param: '{{name}}', value: '' + data.{{name}}});
            }
        }
        {{/data.parameters.sortedParameters.query.false}}
        {{#data.parameters.sortedParameters.body}}
        let queryBody = '';
        {{/data.parameters.sortedParameters.body}}
        {{^data.parameters.sortedParameters.body}}
        const queryBody = '';
        {{/data.parameters.sortedParameters.body}}
        {{#data.parameters.sortedParameters.body.true}}    
        queryBody += JSON.stringify(this.base.unnulling(data.{{name}}));
        {{/data.parameters.sortedParameters.body.true}}
        {{#data.parameters.sortedParameters.body.false}}
        if (typeof data.{{name}} !== 'undefined' && data.{{name}} !== null )
            queryBody += JSON.stringify(this.base.unnulling(data.{{name}}));
        {{/data.parameters.sortedParameters.body.false}}
        return this.base.send('{{data.type}}', path, queryBody, headers, search);
    }
    {{/flatPaths}}

}
