#
# Copyright 2016 SmartBear Software
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#
# NOTE: This class is auto generated by the swagger code generator program. 
# Do not edit the class manually.
#
package {{moduleName}}::{{classname}};

require 5.6.0;
use strict;
use warnings;
use utf8; 
use Exporter;
use Carp qw( croak );
use Log::Any qw($log);

use {{moduleName}}::ApiClient;
use {{moduleName}}::Configuration;

use base "Class::Data::Inheritable";

__PACKAGE__->mk_classdata('method_documentation' => {});

sub new {
    my $class   = shift;
    my (%self) = (
        'api_client' => {{moduleName}}::ApiClient->instance,
        @_
    );

    #my $self = {
    #    #api_client => $options->{api_client}
    #    api_client => $default_api_client
    #}; 

    bless \%self, $class;

}
{{#operations}}

{{#operation}}

#
# {{{operationId}}}
#
# {{{summary}}}
# 
{{#allParams}}# @param {{dataType}} ${{paramName}} {{description}} {{#required}}(required){{/required}}{{^required}}(optional{{#defaultValue}}, default to {{{.}}}{{/defaultValue}}){{/required}}
{{/allParams}}
{
    my $params = {
{{#allParams}}
    '{{paramName}}' => {
        data_type => '{{dataType}}',
        description => '{{description}}',
        required => {{#required}}'1'{{/required}}{{^required}}'0'{{/required}},
    },
{{/allParams}}
    };
    __PACKAGE__->method_documentation->{ {{operationId}} } = { 
    	summary => '{{summary}}',
        params => $params,
        returns => {{#returnType}}'{{{returnType}}}'{{/returnType}}{{^returnType}}undef{{/returnType}},
        };
}
# @return {{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}}
#
sub {{operationId}} {
    my ($self, %args) = @_;

    {{#allParams}}
    {{#required}}
    # verify the required parameter '{{paramName}}' is set
    unless (exists $args{'{{paramName}}'}) {
      croak("Missing the required parameter '{{paramName}}' when calling {{operationId}}");
    }

    {{/required}}
    {{/allParams}}
    # parse inputs
    my $_resource_path = '{{path}}';
    $_resource_path =~ s/{format}/json/; # default format to json

    my $_method = '{{httpMethod}}';
    my $query_params = {};
    my $header_params = {};
    my $form_params = {};

    # 'Accept' and 'Content-Type' header
    my $_header_accept = $self->{api_client}->select_header_accept({{#produces}}'{{{mediaType}}}'{{#hasMore}}, {{/hasMore}}{{/produces}});
    if ($_header_accept) {
        $header_params->{'Accept'} = $_header_accept;
    }
    $header_params->{'Content-Type'} = $self->{api_client}->select_header_content_type({{#consumes}}'{{{mediaType}}}'{{#hasMore}}, {{/hasMore}}{{/consumes}});

    {{#queryParams}}
    # query params
    if ( exists $args{'{{paramName}}'}) {
        $query_params->{'{{baseName}}'} = $self->{api_client}->to_query_value($args{'{{paramName}}'});
    }

    {{/queryParams}}
    {{#headerParams}}
    # header params
    if ( exists $args{'{{paramName}}'}) {
        $header_params->{'{{baseName}}'} = $self->{api_client}->to_header_value($args{'{{paramName}}'});
    }

    {{/headerParams}}
    {{#pathParams}}
    # path params
    if ( exists $args{'{{paramName}}'}) {
        my $_base_variable = "{" . "{{baseName}}" . "}";
        my $_base_value = $self->{api_client}->to_path_value($args{'{{paramName}}'});
        $_resource_path =~ s/$_base_variable/$_base_value/g;
    }

    {{/pathParams}}
    {{#formParams}}
    # form params
    if ( exists $args{'{{paramName}}'} ) {
        {{#isFile}}$form_params->{'{{baseName}}'} = [] unless defined $form_params->{'{{baseName}}'};
        push @{$form_params->{'{{baseName}}'}}, $args{'{{paramName}}'};
        {{/isFile}}
        {{^isFile}}$form_params->{'{{baseName}}'} = $self->{api_client}->to_form_value($args{'{{paramName}}'});
        {{/isFile}}
    }
    
    {{/formParams}}
    my $_body_data;
    {{#bodyParams}}
    # body params
    if ( exists $args{'{{paramName}}'}) {
        $_body_data = $args{'{{paramName}}'};
    }

    {{/bodyParams}}
    # authentication setting, if any
    my $auth_settings = [qw({{#authMethods}}{{name}} {{/authMethods}})];

    # make the API Call
    {{#returnType}}
    my $response = $self->{api_client}->call_api($_resource_path, $_method,
                                           $query_params, $form_params,
                                           $header_params, $_body_data, $auth_settings);
    if (!$response) {
        return;
    }
    my $_response_object = $self->{api_client}->deserialize('{{returnType}}', $response);
    return $_response_object;
    {{/returnType}}
    {{^returnType}}
    $self->{api_client}->call_api($_resource_path, $_method,
                                           $query_params, $form_params,
                                           $header_params, $_body_data, $auth_settings);
    return;
    {{/returnType}}
}
{{/operation}}
{{/operations}}

1;
