/* tslint:disable */
/* eslint-disable */
/**
 * AskNews API
 * AskNews API
 *
 * The version of the OpenAPI document: 0.18.6
 * Contact: contact@emergentmethods.ai
 *
 * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
 * https://openapi-generator.tech
 * Do not edit the class manually.
 */


import * as runtime from '../runtime';
import type {
  CreateNewsletterRequest,
  HTTPValidationError,
  NewsletterContactCreateResponse,
  NewsletterContactRequest,
  NewsletterContactResponse,
  NewsletterContactUpdateResponse,
  NewsletterResponse,
  PaginatedResponseNewsletterPublicResponse,
  PaginatedResponseNewsletterResponse,
  UpdateNewsletterRequest,
} from '../models/index';
import {
    CreateNewsletterRequestFromJSON,
    CreateNewsletterRequestToJSON,
    HTTPValidationErrorFromJSON,
    HTTPValidationErrorToJSON,
    NewsletterContactCreateResponseFromJSON,
    NewsletterContactCreateResponseToJSON,
    NewsletterContactRequestFromJSON,
    NewsletterContactRequestToJSON,
    NewsletterContactResponseFromJSON,
    NewsletterContactResponseToJSON,
    NewsletterContactUpdateResponseFromJSON,
    NewsletterContactUpdateResponseToJSON,
    NewsletterResponseFromJSON,
    NewsletterResponseToJSON,
    PaginatedResponseNewsletterPublicResponseFromJSON,
    PaginatedResponseNewsletterPublicResponseToJSON,
    PaginatedResponseNewsletterResponseFromJSON,
    PaginatedResponseNewsletterResponseToJSON,
    UpdateNewsletterRequestFromJSON,
    UpdateNewsletterRequestToJSON,
} from '../models/index';

export interface DeleteNewsletterRequest {
    newsletterId: string;
}

export interface DeleteNewsletterContactRequest {
    newsletterId: string;
    contactId: string;
}

export interface GetNewsletterRequest {
    newsletterId: string;
}

export interface GetNewsletterContactRequest {
    newsletterId: string;
    contactId: string;
}

export interface GetNewsletterContactsRequest {
    newsletterId: string;
}

export interface GetPublicNewslettersRequest {
    page?: number;
    perPage?: number;
    all?: boolean;
}

export interface PatchNewsletterContactRequest {
    newsletterId: string;
    contactId: string;
    newsletterContactRequest: NewsletterContactRequest;
}

export interface PostNewsletterRequest {
    createNewsletterRequest: CreateNewsletterRequest;
}

export interface PostNewsletterContactsRequest {
    newsletterId: string;
    newsletterContactRequest: NewsletterContactRequest;
}

export interface PutNewsletterRequest {
    newsletterId: string;
    updateNewsletterRequest: UpdateNewsletterRequest;
}

/**
 * 
 */
export class NewslettersApi extends runtime.BaseAPI {

    /**
     * Delete a newsletter.
     * Delete a newsletter
     */
    async deleteNewsletterRaw(requestParameters: DeleteNewsletterRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<void> > {
        if (requestParameters['newsletterId'] == null) {
            throw new runtime.RequiredError(
                'newsletterId',
                'Required parameter "newsletterId" was null or undefined when calling deleteNewsletter().'
            );
        }

        const queryParameters: any = {};

        const headerParameters: runtime.HTTPHeaders = {};

        const response = await this.request({
            path: `/v1/chat/newsletters/{newsletter_id}`.replace(`{${"newsletter_id"}}`, encodeURIComponent(String(requestParameters['newsletterId']))),
            method: 'DELETE',
            headers: headerParameters,
            query: queryParameters,
        }, initOverrides);


        return new runtime.VoidApiResponse(response);
    }

    /**
     * Delete a newsletter.
     * Delete a newsletter
     */
    async deleteNewsletter(requestParameters: DeleteNewsletterRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<void> {
        await this.deleteNewsletterRaw(requestParameters, initOverrides);
    }

    /**
     * Delete a newsletter contact.
     * Delete a newsletter contact
     */
    async deleteNewsletterContactRaw(requestParameters: DeleteNewsletterContactRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<void> > {
        if (requestParameters['newsletterId'] == null) {
            throw new runtime.RequiredError(
                'newsletterId',
                'Required parameter "newsletterId" was null or undefined when calling deleteNewsletterContact().'
            );
        }

        if (requestParameters['contactId'] == null) {
            throw new runtime.RequiredError(
                'contactId',
                'Required parameter "contactId" was null or undefined when calling deleteNewsletterContact().'
            );
        }

        const queryParameters: any = {};

        const headerParameters: runtime.HTTPHeaders = {};

        const response = await this.request({
            path: `/v1/chat/newsletters/{newsletter_id}/contacts/{contact_id}`.replace(`{${"newsletter_id"}}`, encodeURIComponent(String(requestParameters['newsletterId']))).replace(`{${"contact_id"}}`, encodeURIComponent(String(requestParameters['contactId']))),
            method: 'DELETE',
            headers: headerParameters,
            query: queryParameters,
        }, initOverrides);


        return new runtime.VoidApiResponse(response);
    }

    /**
     * Delete a newsletter contact.
     * Delete a newsletter contact
     */
    async deleteNewsletterContact(requestParameters: DeleteNewsletterContactRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<void> {
        await this.deleteNewsletterContactRaw(requestParameters, initOverrides);
    }

    /**
     * Get a newsletter.
     * Get a newsletter
     */
    async getNewsletterRaw(requestParameters: GetNewsletterRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<NewsletterResponse> > {
        if (requestParameters['newsletterId'] == null) {
            throw new runtime.RequiredError(
                'newsletterId',
                'Required parameter "newsletterId" was null or undefined when calling getNewsletter().'
            );
        }

        const queryParameters: any = {};

        const headerParameters: runtime.HTTPHeaders = {};

        const response = await this.request({
            path: `/v1/chat/newsletters/{newsletter_id}`.replace(`{${"newsletter_id"}}`, encodeURIComponent(String(requestParameters['newsletterId']))),
            method: 'GET',
            headers: headerParameters,
            query: queryParameters,
        }, initOverrides);


        return new runtime.JSONApiResponse(response, (jsonValue) => NewsletterResponseFromJSON(jsonValue));
    }

    /**
     * Get a newsletter.
     * Get a newsletter
     */
    async getNewsletter(requestParameters: GetNewsletterRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<NewsletterResponse> {
        const response = await this.getNewsletterRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Get a newsletter contact.
     * Get a newsletter contact
     */
    async getNewsletterContactRaw(requestParameters: GetNewsletterContactRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<NewsletterContactResponse> > {
        if (requestParameters['newsletterId'] == null) {
            throw new runtime.RequiredError(
                'newsletterId',
                'Required parameter "newsletterId" was null or undefined when calling getNewsletterContact().'
            );
        }

        if (requestParameters['contactId'] == null) {
            throw new runtime.RequiredError(
                'contactId',
                'Required parameter "contactId" was null or undefined when calling getNewsletterContact().'
            );
        }

        const queryParameters: any = {};

        const headerParameters: runtime.HTTPHeaders = {};

        const response = await this.request({
            path: `/v1/chat/newsletters/{newsletter_id}/contacts/{contact_id}`.replace(`{${"newsletter_id"}}`, encodeURIComponent(String(requestParameters['newsletterId']))).replace(`{${"contact_id"}}`, encodeURIComponent(String(requestParameters['contactId']))),
            method: 'GET',
            headers: headerParameters,
            query: queryParameters,
        }, initOverrides);


        return new runtime.JSONApiResponse(response, (jsonValue) => NewsletterContactResponseFromJSON(jsonValue));
    }

    /**
     * Get a newsletter contact.
     * Get a newsletter contact
     */
    async getNewsletterContact(requestParameters: GetNewsletterContactRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<NewsletterContactResponse> {
        const response = await this.getNewsletterContactRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Get newsletter contacts.
     * Get newsletter contacts
     */
    async getNewsletterContactsRaw(requestParameters: GetNewsletterContactsRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<Array<NewsletterContactResponse>> > {
        if (requestParameters['newsletterId'] == null) {
            throw new runtime.RequiredError(
                'newsletterId',
                'Required parameter "newsletterId" was null or undefined when calling getNewsletterContacts().'
            );
        }

        const queryParameters: any = {};

        const headerParameters: runtime.HTTPHeaders = {};

        const response = await this.request({
            path: `/v1/chat/newsletters/{newsletter_id}/contacts`.replace(`{${"newsletter_id"}}`, encodeURIComponent(String(requestParameters['newsletterId']))),
            method: 'GET',
            headers: headerParameters,
            query: queryParameters,
        }, initOverrides);


        return new runtime.JSONApiResponse(response, (jsonValue) => jsonValue.map(NewsletterContactResponseFromJSON));
    }

    /**
     * Get newsletter contacts.
     * Get newsletter contacts
     */
    async getNewsletterContacts(requestParameters: GetNewsletterContactsRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<Array<NewsletterContactResponse>> {
        const response = await this.getNewsletterContactsRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Get all created newsletters.
     * Get all created newsletters
     */
    async getNewslettersRaw(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<PaginatedResponseNewsletterResponse> > {
        const queryParameters: any = {};

        const headerParameters: runtime.HTTPHeaders = {};

        const response = await this.request({
            path: `/v1/chat/newsletters`,
            method: 'GET',
            headers: headerParameters,
            query: queryParameters,
        }, initOverrides);


        return new runtime.JSONApiResponse(response, (jsonValue) => PaginatedResponseNewsletterResponseFromJSON(jsonValue));
    }

    /**
     * Get all created newsletters.
     * Get all created newsletters
     */
    async getNewsletters(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<PaginatedResponseNewsletterResponse> {
        const response = await this.getNewslettersRaw(initOverrides);
        return await response.value();
    }

    /**
     * Get all public newsletters.
     * Get all public newsletters
     */
    async getPublicNewslettersRaw(requestParameters: GetPublicNewslettersRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<PaginatedResponseNewsletterPublicResponse> > {
        const queryParameters: any = {};

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

        if (requestParameters['perPage'] != null) {
            queryParameters['per_page'] = requestParameters['perPage'];
        }

        if (requestParameters['all'] != null) {
            queryParameters['all'] = requestParameters['all'];
        }

        const headerParameters: runtime.HTTPHeaders = {};

        const response = await this.request({
            path: `/v1/chat/newsletters/public`,
            method: 'GET',
            headers: headerParameters,
            query: queryParameters,
        }, initOverrides);


        return new runtime.JSONApiResponse(response, (jsonValue) => PaginatedResponseNewsletterPublicResponseFromJSON(jsonValue));
    }

    /**
     * Get all public newsletters.
     * Get all public newsletters
     */
    async getPublicNewsletters(requestParameters: GetPublicNewslettersRequest = {}, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<PaginatedResponseNewsletterPublicResponse> {
        const response = await this.getPublicNewslettersRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Update a newsletter contact.
     * Update a newsletter contact
     */
    async patchNewsletterContactRaw(requestParameters: PatchNewsletterContactRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<NewsletterContactUpdateResponse>  | runtime.StreamApiResponse> {
        if (requestParameters['newsletterId'] == null) {
            throw new runtime.RequiredError(
                'newsletterId',
                'Required parameter "newsletterId" was null or undefined when calling patchNewsletterContact().'
            );
        }

        if (requestParameters['contactId'] == null) {
            throw new runtime.RequiredError(
                'contactId',
                'Required parameter "contactId" was null or undefined when calling patchNewsletterContact().'
            );
        }

        if (requestParameters['newsletterContactRequest'] == null) {
            throw new runtime.RequiredError(
                'newsletterContactRequest',
                'Required parameter "newsletterContactRequest" was null or undefined when calling patchNewsletterContact().'
            );
        }

        const queryParameters: any = {};

        const headerParameters: runtime.HTTPHeaders = {};

        headerParameters['Content-Type'] = 'application/json';

        const response = await this.request({
            path: `/v1/chat/newsletters/{newsletter_id}/contacts/{contact_id}`.replace(`{${"newsletter_id"}}`, encodeURIComponent(String(requestParameters['newsletterId']))).replace(`{${"contact_id"}}`, encodeURIComponent(String(requestParameters['contactId']))),
            method: 'PATCH',
            headers: headerParameters,
            query: queryParameters,
            body: NewsletterContactRequestToJSON(requestParameters['newsletterContactRequest']),
        }, initOverrides);

        if ('newsletterContactRequest' in requestParameters && requestParameters['newsletterContactRequest'] != null && 'stream' in requestParameters['newsletterContactRequest'] && requestParameters['newsletterContactRequest']['stream'] === true) {
            return new runtime.StreamApiResponse(response);
        }

        return new runtime.JSONApiResponse(response, (jsonValue) => NewsletterContactUpdateResponseFromJSON(jsonValue));
    }

    /**
     * Update a newsletter contact.
     * Update a newsletter contact
     */
    async patchNewsletterContact(requestParameters: PatchNewsletterContactRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<NewsletterContactUpdateResponse | ReadableStream<any>> {
        const response = await this.patchNewsletterContactRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Create a newsletter.
     * Create a newsletter
     */
    async postNewsletterRaw(requestParameters: PostNewsletterRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<NewsletterResponse>  | runtime.StreamApiResponse> {
        if (requestParameters['createNewsletterRequest'] == null) {
            throw new runtime.RequiredError(
                'createNewsletterRequest',
                'Required parameter "createNewsletterRequest" was null or undefined when calling postNewsletter().'
            );
        }

        const queryParameters: any = {};

        const headerParameters: runtime.HTTPHeaders = {};

        headerParameters['Content-Type'] = 'application/json';

        const response = await this.request({
            path: `/v1/chat/newsletters`,
            method: 'POST',
            headers: headerParameters,
            query: queryParameters,
            body: CreateNewsletterRequestToJSON(requestParameters['createNewsletterRequest']),
        }, initOverrides);

        if ('createNewsletterRequest' in requestParameters && requestParameters['createNewsletterRequest'] != null && 'stream' in requestParameters['createNewsletterRequest'] && requestParameters['createNewsletterRequest']['stream'] === true) {
            return new runtime.StreamApiResponse(response);
        }

        return new runtime.JSONApiResponse(response, (jsonValue) => NewsletterResponseFromJSON(jsonValue));
    }

    /**
     * Create a newsletter.
     * Create a newsletter
     */
    async postNewsletter(requestParameters: PostNewsletterRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<NewsletterResponse | ReadableStream<any>> {
        const response = await this.postNewsletterRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Create a newsletter contact.
     * Create a newsletter contact
     */
    async postNewsletterContactsRaw(requestParameters: PostNewsletterContactsRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<NewsletterContactCreateResponse>  | runtime.StreamApiResponse> {
        if (requestParameters['newsletterId'] == null) {
            throw new runtime.RequiredError(
                'newsletterId',
                'Required parameter "newsletterId" was null or undefined when calling postNewsletterContacts().'
            );
        }

        if (requestParameters['newsletterContactRequest'] == null) {
            throw new runtime.RequiredError(
                'newsletterContactRequest',
                'Required parameter "newsletterContactRequest" was null or undefined when calling postNewsletterContacts().'
            );
        }

        const queryParameters: any = {};

        const headerParameters: runtime.HTTPHeaders = {};

        headerParameters['Content-Type'] = 'application/json';

        const response = await this.request({
            path: `/v1/chat/newsletters/{newsletter_id}/contacts`.replace(`{${"newsletter_id"}}`, encodeURIComponent(String(requestParameters['newsletterId']))),
            method: 'POST',
            headers: headerParameters,
            query: queryParameters,
            body: NewsletterContactRequestToJSON(requestParameters['newsletterContactRequest']),
        }, initOverrides);

        if ('newsletterContactRequest' in requestParameters && requestParameters['newsletterContactRequest'] != null && 'stream' in requestParameters['newsletterContactRequest'] && requestParameters['newsletterContactRequest']['stream'] === true) {
            return new runtime.StreamApiResponse(response);
        }

        return new runtime.JSONApiResponse(response, (jsonValue) => NewsletterContactCreateResponseFromJSON(jsonValue));
    }

    /**
     * Create a newsletter contact.
     * Create a newsletter contact
     */
    async postNewsletterContacts(requestParameters: PostNewsletterContactsRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<NewsletterContactCreateResponse | ReadableStream<any>> {
        const response = await this.postNewsletterContactsRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Update a newsletter.
     * Update a newsletter
     */
    async putNewsletterRaw(requestParameters: PutNewsletterRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<NewsletterResponse>  | runtime.StreamApiResponse> {
        if (requestParameters['newsletterId'] == null) {
            throw new runtime.RequiredError(
                'newsletterId',
                'Required parameter "newsletterId" was null or undefined when calling putNewsletter().'
            );
        }

        if (requestParameters['updateNewsletterRequest'] == null) {
            throw new runtime.RequiredError(
                'updateNewsletterRequest',
                'Required parameter "updateNewsletterRequest" was null or undefined when calling putNewsletter().'
            );
        }

        const queryParameters: any = {};

        const headerParameters: runtime.HTTPHeaders = {};

        headerParameters['Content-Type'] = 'application/json';

        const response = await this.request({
            path: `/v1/chat/newsletters/{newsletter_id}`.replace(`{${"newsletter_id"}}`, encodeURIComponent(String(requestParameters['newsletterId']))),
            method: 'PUT',
            headers: headerParameters,
            query: queryParameters,
            body: UpdateNewsletterRequestToJSON(requestParameters['updateNewsletterRequest']),
        }, initOverrides);

        if ('updateNewsletterRequest' in requestParameters && requestParameters['updateNewsletterRequest'] != null && 'stream' in requestParameters['updateNewsletterRequest'] && requestParameters['updateNewsletterRequest']['stream'] === true) {
            return new runtime.StreamApiResponse(response);
        }

        return new runtime.JSONApiResponse(response, (jsonValue) => NewsletterResponseFromJSON(jsonValue));
    }

    /**
     * Update a newsletter.
     * Update a newsletter
     */
    async putNewsletter(requestParameters: PutNewsletterRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<NewsletterResponse | ReadableStream<any>> {
        const response = await this.putNewsletterRaw(requestParameters, initOverrides);
        return await response.value();
    }

}
