/*This file was automatically generated */
// tslint:disable
// @ts-nocheck
/* eslint-disable */

{% if class|is_not_empty %}
import { {{class.name}} } from '{{class.viewModelFromMapper}}';
import { {{class.baseName}} } from '{{class.baseModelFromMapper}}';
{% for import in imports %}
{%if import.forMapper ===true%}
{% if import.type.includes('Mapper') %}
import { {{import.type }} } from '{{import.path}}';
{% elif 'Mapper' not in import.type%}
import { {{import.type }} } from '{{import.path}}';
{%endif %}
{%endif %}
{% endfor %}
{% endif %}

{% if class|is_not_empty %}
export class {{class.name}}Mapper {
      public static {% if class.isToViewAsync %}async {% endif %}to{{class.name}}(model: {{class.baseName}}{% if class.contextType.toView.value %}, context{% if class.contextType.toView.mandatory === false %}?{% endif %}: {{class.contextType.toView.value}}{% endif %}): {% if class.isToViewAsync %}Promise<{% endif %}{{class.name}}{% if class.isToViewAsync %}>{% endif %} {
{% if class.type==='interface' %}
            let result:any = {};
{% else %}
      let result = new {{class.name}}();
{% endif %}
{% for field in class.fields %}
{% if field.ignoredInView === false %}
{%if field.fieldConvertFunction %}
{% if field.fieldConvertFunction.toView %}
{% if field.fieldConvertFunction.toView.isPrimitive === false %}
            result.{{field.name}} = {% if field.fieldConvertFunction.toView.isAsync %}await{% endif %} {{field.fieldConvertFunction.toView.function}}(model{% if field.name in class.contextTypeFields.toView %}, context{% endif %});
{% else %}
{% if field.fieldConvertFunction.toView.isPrimitiveString === true %}
      result.{{field.name}} = "{{field.fieldConvertFunction.toView.function}}";
{% else %}
      result.{{field.name}} = {{field.fieldConvertFunction.toView.function}};
{% endif %}
{% endif %}
{% else %}
      result.{{field.name}} = model.{{field.baseModelName}}
{% endif %}
{% elif field.isArray %}
{% if field.needGeneratedMapper %}
      if (model.{{field.baseModelName}}) {
            let tmp = {% if class.isToViewAsync %}await{% endif %} model.{{field.baseModelName}}.map({% if class.isToViewAsync %}async{% endif %} function(item: any ) {return {% if class.isToViewAsync %}await{% endif %} {{field.type}}Mapper.to{{field.type}}(item); });
            tmp.forEach({% if class.isToViewAsync %}async{% endif %} mp => {
                  let p = {% if class.isToViewAsync %}await{% endif %} mp;
                  result.{{field.name}}.push(p); });
      }
{% else %}
            if (model.{{field.baseModelName}}) {
                  result.{{field.name}} = model.{{field.baseModelName}}.map(function(item: any ) { return JSON.parse(JSON.stringify(item)); });
            }
{% endif %}
{% else %}
{% if field.needGeneratedMapper %}
            if (model.{{field.baseModelName}}) {
                  result.{{field.name}} = {% if class.isToViewAsync %}await{% endif %} {{field.type}}Mapper.to{{field.type}}(model.{{field.baseModelName}});
            }
{% elif field.isComplexType %}
            if (model.{{field.baseModelName}}) {
                  result.{{field.name}} = JSON.parse(JSON.stringify(model.{{field.baseModelName}}));
            }
{% elif field.type === "number" %}
            result.{{field.name}} = model.{{field.baseModelName}} ? +model.{{field.baseModelName}} : model.{{field.baseModelName}};
{% else %}
            result.{{field.name}} = model.{{field.baseModelName}}{% if field.toStringWanted %}.toString(){% endif%};
{% endif %}
{% endif %}
{% endif %}
{% endfor %}
            return result;
      }
      public static {% if class.isFromViewAsync %}async {% endif %}from{{class.name}}(viewModel: {{class.name}}{% if class.contextType.fromView.value %}, context{% if class.contextType.fromView.mandatory === false %}?{% endif %}: {{class.contextType.fromView.value}}{% endif %}): {% if class.isFromViewAsync %}Promise<{%endif%}{{class.baseName}}{% if class.isFromViewAsync %}>{%endif%} {
            let result = new {{class.baseName}}();
{% for field in class.fields %}
{% if field.ignoredInView === false %}
{% if field.fieldConvertFunction and field.fieldConvertFunction.fromView %}
{% if field.fieldConvertFunction.fromView.isPrimitive === false %}
            result.{{field.baseModelName}} = {% if field.fieldConvertFunction.fromView.isAsync %}await{% endif%} {{field.fieldConvertFunction.fromView.function}}(viewModel{% if field.name in class.contextTypeFields.fromView %}, context{% endif %});
{% else %}
      {% if field.fieldConvertFunction.fromView.isPrimitiveString === true%}  
      result.{{field.baseModelName}} = "{{field.fieldConvertFunction.fromView.function}}";
      {% else %}
      result.{{field.baseModelName}} = {{field.fieldConvertFunction.fromView.function}};
      {% endif %}
{%endif%}
{% elif field.isArray %}
{% if field.needGeneratedMapper %}
            if (viewModel.{{field.name}}) {
                  let tmp = {% if class.isFromViewAsync %}await{% endif %} viewModel.{{field.name}}.map({% if class.isFromViewAsync %}async{% endif %} function(item: any ) {return {% if class.isFromViewAsync %}await{% endif %} {{field.type}}Mapper.from{{field.type}}(item); });
                  tmp.forEach({% if class.isFromViewAsync %}async{% endif %} mp => {
                       let p = {% if class.isFromViewAsync %}await{% endif %} mp;
                       result.{{field.baseModelName}}.push(p); });
            }
{% else %}
            if (viewModel.{{field.name}}) {
                  result.{{field.baseModelName}} = viewModel.{{field.name}}.map(function(item: any ) { return JSON.parse(JSON.stringify( item )); });
            }
{% endif %}
{% else %}
{% if field.needGeneratedMapper %}
            if (viewModel.{{field.name}}) {
                  result.{{field.baseModelName}} = {% if class.isFromViewAsync %}await{% endif %} {{field.type}}Mapper.from{{field.type}}(viewModel.{{field.name}});
            }
{% elif field.isComplexType %}
            if (viewModel.{{field.name}}) {
                  result.{{field.baseModelName}} = JSON.parse(JSON.stringify(viewModel.{{field.name}}));
            }
{% else %}
{% if field.toStringWanted %}
            result.{{field.baseModelName}} = viewModel.{{field.name}} ? +viewModel.{{field.name}} : viewModel.{{field.name}} as any;
{% else %}
            result.{{field.baseModelName}} = viewModel.{{field.name}};
{% endif %}
{% endif %}
{% endif %}
{% endif %}
{%endfor%}
            return result;
      }
}
{%endif%}
