/* tslint:disable */
/* eslint-disable */
/**
 * Paystack
 * The OpenAPI specification of the Paystack API that merchants and developers can harness to build financial solutions in Africa.
 *
 * The version of the Paystack Node library: 1.0.0
 * Contact: techsupport@paystack.com
 *
 * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
 * https://openapi-generator.tech
 * Do not edit the class manually.
 */


import { BaseAPI, RequiredError } from '../runtime';
import {
    Response,
    ResponseFromJSON
} from '../models';

export interface DownloadRequest {
    perPage?: number;
    page?: number;
    status?: string;
    from?: Date;
    to?: Date;
}

export interface EvidenceRequest {
    id: string;
    customer_email: string;
    customer_name: string;
    customer_phone: string;
    service_details: string;
    delivery_address?: string;
    delivery_date?: Date;
}

export interface FetchRequest {
    id: string;
}

export interface ListRequest {
    perPage?: number;
    page?: number;
    status?: string;
    transaction?: string;
    from?: Date;
    to?: Date;
}

export interface ResolveRequest {
    id: string;
    resolution: string;
    message: string;
    refund_amount: string;
    uploaded_filename: string;
    evidence?: number;
}

export interface TransactionRequest {
    id: string;
}

export interface UpdateRequest {
    id: string;
    refund_amount: string;
    uploaded_filename?: string;
}

export interface UploadUrlRequest {
    id: string;
}

/**
 * 
 */
export class Dispute extends BaseAPI {

    /**
     * Export Disputes
     */
    async download(requestParameters: DownloadRequest): Promise<Response> {
        const queryParameters: any = {};

        if (requestParameters.perPage !== undefined) {
            queryParameters['perPage'] = requestParameters.perPage;
        }

        if (requestParameters.page !== undefined) {
            queryParameters['page'] = requestParameters.page;
        }

        if (requestParameters.status !== undefined) {
            queryParameters['status'] = requestParameters.status;
        }

        if (requestParameters.from !== undefined) {
            queryParameters['from'] = (requestParameters.from as any).toISOString();
        }

        if (requestParameters.to !== undefined) {
            queryParameters['to'] = (requestParameters.to as any).toISOString();
        }


        const response = await this.request({
            path: `/dispute/export`,
            method: 'GET',
            query: queryParameters,
        });
        
        return ResponseFromJSON(response);
    }

    /**
     * Add Evidence
     */
    async evidence(requestParameters: EvidenceRequest): Promise<Response> {
        if (requestParameters.id === null || requestParameters.id === undefined) {
            throw new RequiredError('id','Required parameter id was null or undefined when calling evidence.');
        }
        if (requestParameters.customer_email === null || requestParameters.customer_email === undefined) {
            throw new RequiredError('customer_email','Required parameter customer_email was null or undefined when calling evidence.');
        }
        if (requestParameters.customer_name === null || requestParameters.customer_name === undefined) {
            throw new RequiredError('customer_name','Required parameter customer_name was null or undefined when calling evidence.');
        }
        if (requestParameters.customer_phone === null || requestParameters.customer_phone === undefined) {
            throw new RequiredError('customer_phone','Required parameter customer_phone was null or undefined when calling evidence.');
        }
        if (requestParameters.service_details === null || requestParameters.service_details === undefined) {
            throw new RequiredError('service_details','Required parameter service_details was null or undefined when calling evidence.');
        }
        const queryParameters: any = {};

        let formParams: any = {};

        if (requestParameters.customer_email !== undefined) {
            formParams['customer_email'] = requestParameters.customer_email;
        }

        if (requestParameters.customer_name !== undefined) {
            formParams['customer_name'] = requestParameters.customer_name;
        }

        if (requestParameters.customer_phone !== undefined) {
            formParams['customer_phone'] = requestParameters.customer_phone;
        }

        if (requestParameters.service_details !== undefined) {
            formParams['service_details'] = requestParameters.service_details;
        }

        if (requestParameters.delivery_address !== undefined) {
            formParams['delivery_address'] = requestParameters.delivery_address;
        }

        if (requestParameters.delivery_date !== undefined) {
            formParams['delivery_date'] = requestParameters.delivery_date;
        }


        const response = await this.request({
            path: `/dispute/{id}/evidence`.replace(`{${"id"}}`, encodeURIComponent(String(requestParameters.id))),
            method: 'POST',
            query: queryParameters,
            body: formParams,
        });
        
        return ResponseFromJSON(response);
    }

    /**
     * Fetch Dispute
     */
    async fetch(requestParameters: FetchRequest): Promise<Response> {
        if (requestParameters.id === null || requestParameters.id === undefined) {
            throw new RequiredError('id','Required parameter id was null or undefined when calling fetch.');
        }
        const queryParameters: any = {};


        const response = await this.request({
            path: `/dispute/{id}`.replace(`{${"id"}}`, encodeURIComponent(String(requestParameters.id))),
            method: 'GET',
            query: queryParameters,
        });
        
        return ResponseFromJSON(response);
    }

    /**
     * List Disputes
     */
    async list(requestParameters: ListRequest): Promise<Response> {
        const queryParameters: any = {};

        if (requestParameters.perPage !== undefined) {
            queryParameters['perPage'] = requestParameters.perPage;
        }

        if (requestParameters.page !== undefined) {
            queryParameters['page'] = requestParameters.page;
        }

        if (requestParameters.status !== undefined) {
            queryParameters['status'] = requestParameters.status;
        }

        if (requestParameters.transaction !== undefined) {
            queryParameters['transaction'] = requestParameters.transaction;
        }

        if (requestParameters.from !== undefined) {
            queryParameters['from'] = (requestParameters.from as any).toISOString();
        }

        if (requestParameters.to !== undefined) {
            queryParameters['to'] = (requestParameters.to as any).toISOString();
        }


        const response = await this.request({
            path: `/dispute`,
            method: 'GET',
            query: queryParameters,
        });
        
        return ResponseFromJSON(response);
    }

    /**
     * Resolve a Dispute
     */
    async resolve(requestParameters: ResolveRequest): Promise<Response> {
        if (requestParameters.id === null || requestParameters.id === undefined) {
            throw new RequiredError('id','Required parameter id was null or undefined when calling resolve.');
        }
        if (requestParameters.resolution === null || requestParameters.resolution === undefined) {
            throw new RequiredError('resolution','Required parameter resolution was null or undefined when calling resolve.');
        }
        if (requestParameters.message === null || requestParameters.message === undefined) {
            throw new RequiredError('message','Required parameter message was null or undefined when calling resolve.');
        }
        if (requestParameters.refund_amount === null || requestParameters.refund_amount === undefined) {
            throw new RequiredError('refund_amount','Required parameter refund_amount was null or undefined when calling resolve.');
        }
        if (requestParameters.uploaded_filename === null || requestParameters.uploaded_filename === undefined) {
            throw new RequiredError('uploaded_filename','Required parameter uploaded_filename was null or undefined when calling resolve.');
        }
        const queryParameters: any = {};

        let formParams: any = {};

        if (requestParameters.resolution !== undefined) {
            formParams['resolution'] = requestParameters.resolution;
        }

        if (requestParameters.message !== undefined) {
            formParams['message'] = requestParameters.message;
        }

        if (requestParameters.refund_amount !== undefined) {
            formParams['refund_amount'] = requestParameters.refund_amount;
        }

        if (requestParameters.uploaded_filename !== undefined) {
            formParams['uploaded_filename'] = requestParameters.uploaded_filename;
        }

        if (requestParameters.evidence !== undefined) {
            formParams['evidence'] = requestParameters.evidence;
        }


        const response = await this.request({
            path: `/dispute/{id}/resolve`.replace(`{${"id"}}`, encodeURIComponent(String(requestParameters.id))),
            method: 'PUT',
            query: queryParameters,
            body: formParams,
        });
        
        return ResponseFromJSON(response);
    }

    /**
     * List Transaction Disputes
     */
    async transaction(requestParameters: TransactionRequest): Promise<Response> {
        if (requestParameters.id === null || requestParameters.id === undefined) {
            throw new RequiredError('id','Required parameter id was null or undefined when calling transaction.');
        }
        const queryParameters: any = {};


        const response = await this.request({
            path: `/dispute/transaction/{id}`.replace(`{${"id"}}`, encodeURIComponent(String(requestParameters.id))),
            method: 'GET',
            query: queryParameters,
        });
        
        return ResponseFromJSON(response);
    }

    /**
     * Update Dispute
     */
    async update(requestParameters: UpdateRequest): Promise<Response> {
        if (requestParameters.id === null || requestParameters.id === undefined) {
            throw new RequiredError('id','Required parameter id was null or undefined when calling update.');
        }
        if (requestParameters.refund_amount === null || requestParameters.refund_amount === undefined) {
            throw new RequiredError('refund_amount','Required parameter refund_amount was null or undefined when calling update.');
        }
        const queryParameters: any = {};

        let formParams: any = {};

        if (requestParameters.refund_amount !== undefined) {
            formParams['refund_amount'] = requestParameters.refund_amount;
        }

        if (requestParameters.uploaded_filename !== undefined) {
            formParams['uploaded_filename'] = requestParameters.uploaded_filename;
        }


        const response = await this.request({
            path: `/dispute/{id}`.replace(`{${"id"}}`, encodeURIComponent(String(requestParameters.id))),
            method: 'PUT',
            query: queryParameters,
            body: formParams,
        });
        
        return ResponseFromJSON(response);
    }

    /**
     * Get Upload URL
     */
    async uploadUrl(requestParameters: UploadUrlRequest): Promise<Response> {
        if (requestParameters.id === null || requestParameters.id === undefined) {
            throw new RequiredError('id','Required parameter id was null or undefined when calling uploadUrl.');
        }
        const queryParameters: any = {};


        const response = await this.request({
            path: `/dispute/{id}/upload_url`.replace(`{${"id"}}`, encodeURIComponent(String(requestParameters.id))),
            method: 'GET',
            query: queryParameters,
        });
        
        return ResponseFromJSON(response);
    }

}
