/* tslint:disable */
/* eslint-disable */
/**
 * Tuix Services
 * Tuix Services API
 *
 * The version of the OpenAPI document: 1.0.0
 * 
 *
 * 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 {
  ErrorDTO,
  ProductDTO,
  UserDTO,
} from '../models/index';
import {
    ErrorDTOFromJSON,
    ErrorDTOToJSON,
    ProductDTOFromJSON,
    ProductDTOToJSON,
    UserDTOFromJSON,
    UserDTOToJSON,
} from '../models/index';

export interface CreateProductRequest {
    productDTO: ProductDTO;
}

export interface CreateUserRequest {
    userDTO: UserDTO;
}

export interface DeleteProductRequest {
    productId: string;
}

export interface DeleteProductAssetRequest {
    productId: string;
    assetId: string;
}

export interface DeleteUserRequest {
    id: string;
}

export interface GetProductByIdRequest {
    productId: string;
}

export interface GetUserByIdRequest {
    id: string;
}

export interface ProductsProductIdAssetAssetIdOptionsRequest {
    productId: string;
    assetId: string;
}

export interface ProductsProductIdAssetOptionsRequest {
    productId: string;
}

export interface ProductsProductIdOptionsRequest {
    productId: string;
}

export interface UpdateProductRequest {
    productId: string;
    productDTO: ProductDTO;
}

export interface UpdateUserRequest {
    id: string;
    userDTO: UserDTO;
}

export interface UploadProductAssetRequest {
    productId: string;
    file: Blob;
}

export interface UsersIdOptionsRequest {
    id: string;
}

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

    /**
     * Create product
     * Create a product
     */
    async createProductRaw(requestParameters: CreateProductRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<ProductDTO>> {
        if (requestParameters['productDTO'] == null) {
            throw new runtime.RequiredError(
                'productDTO',
                'Required parameter "productDTO" was null or undefined when calling createProduct().'
            );
        }

        const queryParameters: any = {};

        const headerParameters: runtime.HTTPHeaders = {};

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


        let urlPath = `/products`;

        const response = await this.request({
            path: urlPath,
            method: 'POST',
            headers: headerParameters,
            query: queryParameters,
            body: ProductDTOToJSON(requestParameters['productDTO']),
        }, initOverrides);

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

    /**
     * Create product
     * Create a product
     */
    async createProduct(requestParameters: CreateProductRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<ProductDTO> {
        const response = await this.createProductRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Create user
     * Create a user
     */
    async createUserRaw(requestParameters: CreateUserRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<UserDTO>> {
        if (requestParameters['userDTO'] == null) {
            throw new runtime.RequiredError(
                'userDTO',
                'Required parameter "userDTO" was null or undefined when calling createUser().'
            );
        }

        const queryParameters: any = {};

        const headerParameters: runtime.HTTPHeaders = {};

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


        let urlPath = `/users`;

        const response = await this.request({
            path: urlPath,
            method: 'POST',
            headers: headerParameters,
            query: queryParameters,
            body: UserDTOToJSON(requestParameters['userDTO']),
        }, initOverrides);

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

    /**
     * Create user
     * Create a user
     */
    async createUser(requestParameters: CreateUserRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<UserDTO> {
        const response = await this.createUserRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Delete product
     * Delete a product by ID
     */
    async deleteProductRaw(requestParameters: DeleteProductRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<void>> {
        if (requestParameters['productId'] == null) {
            throw new runtime.RequiredError(
                'productId',
                'Required parameter "productId" was null or undefined when calling deleteProduct().'
            );
        }

        const queryParameters: any = {};

        const headerParameters: runtime.HTTPHeaders = {};


        let urlPath = `/products/{productId}`;
        urlPath = urlPath.replace(`{${"productId"}}`, encodeURIComponent(String(requestParameters['productId'])));

        const response = await this.request({
            path: urlPath,
            method: 'DELETE',
            headers: headerParameters,
            query: queryParameters,
        }, initOverrides);

        return new runtime.VoidApiResponse(response);
    }

    /**
     * Delete product
     * Delete a product by ID
     */
    async deleteProduct(requestParameters: DeleteProductRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<void> {
        await this.deleteProductRaw(requestParameters, initOverrides);
    }

    /**
     * Delete product asset
     * Delete a product asset by ID
     */
    async deleteProductAssetRaw(requestParameters: DeleteProductAssetRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<void>> {
        if (requestParameters['productId'] == null) {
            throw new runtime.RequiredError(
                'productId',
                'Required parameter "productId" was null or undefined when calling deleteProductAsset().'
            );
        }

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

        const queryParameters: any = {};

        const headerParameters: runtime.HTTPHeaders = {};


        let urlPath = `/products/{productId}/asset/{assetId}`;
        urlPath = urlPath.replace(`{${"productId"}}`, encodeURIComponent(String(requestParameters['productId'])));
        urlPath = urlPath.replace(`{${"assetId"}}`, encodeURIComponent(String(requestParameters['assetId'])));

        const response = await this.request({
            path: urlPath,
            method: 'DELETE',
            headers: headerParameters,
            query: queryParameters,
        }, initOverrides);

        return new runtime.VoidApiResponse(response);
    }

    /**
     * Delete product asset
     * Delete a product asset by ID
     */
    async deleteProductAsset(requestParameters: DeleteProductAssetRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<void> {
        await this.deleteProductAssetRaw(requestParameters, initOverrides);
    }

    /**
     * Delete user
     * Delete a user by ID
     */
    async deleteUserRaw(requestParameters: DeleteUserRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<void>> {
        if (requestParameters['id'] == null) {
            throw new runtime.RequiredError(
                'id',
                'Required parameter "id" was null or undefined when calling deleteUser().'
            );
        }

        const queryParameters: any = {};

        const headerParameters: runtime.HTTPHeaders = {};


        let urlPath = `/users/{id}`;
        urlPath = urlPath.replace(`{${"id"}}`, encodeURIComponent(String(requestParameters['id'])));

        const response = await this.request({
            path: urlPath,
            method: 'DELETE',
            headers: headerParameters,
            query: queryParameters,
        }, initOverrides);

        return new runtime.VoidApiResponse(response);
    }

    /**
     * Delete user
     * Delete a user by ID
     */
    async deleteUser(requestParameters: DeleteUserRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<void> {
        await this.deleteUserRaw(requestParameters, initOverrides);
    }

    /**
     * Get product by id
     * Get a product by ID
     */
    async getProductByIdRaw(requestParameters: GetProductByIdRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<ProductDTO>> {
        if (requestParameters['productId'] == null) {
            throw new runtime.RequiredError(
                'productId',
                'Required parameter "productId" was null or undefined when calling getProductById().'
            );
        }

        const queryParameters: any = {};

        const headerParameters: runtime.HTTPHeaders = {};


        let urlPath = `/products/{productId}`;
        urlPath = urlPath.replace(`{${"productId"}}`, encodeURIComponent(String(requestParameters['productId'])));

        const response = await this.request({
            path: urlPath,
            method: 'GET',
            headers: headerParameters,
            query: queryParameters,
        }, initOverrides);

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

    /**
     * Get product by id
     * Get a product by ID
     */
    async getProductById(requestParameters: GetProductByIdRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<ProductDTO> {
        const response = await this.getProductByIdRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Get all products
     * Get all products
     */
    async getProductsRaw(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<Array<ProductDTO>>> {
        const queryParameters: any = {};

        const headerParameters: runtime.HTTPHeaders = {};


        let urlPath = `/products`;

        const response = await this.request({
            path: urlPath,
            method: 'GET',
            headers: headerParameters,
            query: queryParameters,
        }, initOverrides);

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

    /**
     * Get all products
     * Get all products
     */
    async getProducts(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<Array<ProductDTO>> {
        const response = await this.getProductsRaw(initOverrides);
        return await response.value();
    }

    /**
     * Get user by id
     * Get a user by ID
     */
    async getUserByIdRaw(requestParameters: GetUserByIdRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<UserDTO>> {
        if (requestParameters['id'] == null) {
            throw new runtime.RequiredError(
                'id',
                'Required parameter "id" was null or undefined when calling getUserById().'
            );
        }

        const queryParameters: any = {};

        const headerParameters: runtime.HTTPHeaders = {};


        let urlPath = `/users/{id}`;
        urlPath = urlPath.replace(`{${"id"}}`, encodeURIComponent(String(requestParameters['id'])));

        const response = await this.request({
            path: urlPath,
            method: 'GET',
            headers: headerParameters,
            query: queryParameters,
        }, initOverrides);

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

    /**
     * Get user by id
     * Get a user by ID
     */
    async getUserById(requestParameters: GetUserByIdRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<UserDTO> {
        const response = await this.getUserByIdRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Get all users
     * Get all users
     */
    async getUsersRaw(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<Array<UserDTO>>> {
        const queryParameters: any = {};

        const headerParameters: runtime.HTTPHeaders = {};


        let urlPath = `/users`;

        const response = await this.request({
            path: urlPath,
            method: 'GET',
            headers: headerParameters,
            query: queryParameters,
        }, initOverrides);

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

    /**
     * Get all users
     * Get all users
     */
    async getUsers(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<Array<UserDTO>> {
        const response = await this.getUsersRaw(initOverrides);
        return await response.value();
    }

    /**
     * Enable CORS by returning correct headers
     * CORS support
     */
    async productsOptionsRaw(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<void>> {
        const queryParameters: any = {};

        const headerParameters: runtime.HTTPHeaders = {};


        let urlPath = `/products`;

        const response = await this.request({
            path: urlPath,
            method: 'OPTIONS',
            headers: headerParameters,
            query: queryParameters,
        }, initOverrides);

        return new runtime.VoidApiResponse(response);
    }

    /**
     * Enable CORS by returning correct headers
     * CORS support
     */
    async productsOptions(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<void> {
        await this.productsOptionsRaw(initOverrides);
    }

    /**
     * Enable CORS by returning correct headers
     * CORS support
     */
    async productsProductIdAssetAssetIdOptionsRaw(requestParameters: ProductsProductIdAssetAssetIdOptionsRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<void>> {
        if (requestParameters['productId'] == null) {
            throw new runtime.RequiredError(
                'productId',
                'Required parameter "productId" was null or undefined when calling productsProductIdAssetAssetIdOptions().'
            );
        }

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

        const queryParameters: any = {};

        const headerParameters: runtime.HTTPHeaders = {};


        let urlPath = `/products/{productId}/asset/{assetId}`;
        urlPath = urlPath.replace(`{${"productId"}}`, encodeURIComponent(String(requestParameters['productId'])));
        urlPath = urlPath.replace(`{${"assetId"}}`, encodeURIComponent(String(requestParameters['assetId'])));

        const response = await this.request({
            path: urlPath,
            method: 'OPTIONS',
            headers: headerParameters,
            query: queryParameters,
        }, initOverrides);

        return new runtime.VoidApiResponse(response);
    }

    /**
     * Enable CORS by returning correct headers
     * CORS support
     */
    async productsProductIdAssetAssetIdOptions(requestParameters: ProductsProductIdAssetAssetIdOptionsRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<void> {
        await this.productsProductIdAssetAssetIdOptionsRaw(requestParameters, initOverrides);
    }

    /**
     * Enable CORS by returning correct headers
     * CORS support
     */
    async productsProductIdAssetOptionsRaw(requestParameters: ProductsProductIdAssetOptionsRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<void>> {
        if (requestParameters['productId'] == null) {
            throw new runtime.RequiredError(
                'productId',
                'Required parameter "productId" was null or undefined when calling productsProductIdAssetOptions().'
            );
        }

        const queryParameters: any = {};

        const headerParameters: runtime.HTTPHeaders = {};


        let urlPath = `/products/{productId}/asset`;
        urlPath = urlPath.replace(`{${"productId"}}`, encodeURIComponent(String(requestParameters['productId'])));

        const response = await this.request({
            path: urlPath,
            method: 'OPTIONS',
            headers: headerParameters,
            query: queryParameters,
        }, initOverrides);

        return new runtime.VoidApiResponse(response);
    }

    /**
     * Enable CORS by returning correct headers
     * CORS support
     */
    async productsProductIdAssetOptions(requestParameters: ProductsProductIdAssetOptionsRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<void> {
        await this.productsProductIdAssetOptionsRaw(requestParameters, initOverrides);
    }

    /**
     * Enable CORS by returning correct headers
     * CORS support
     */
    async productsProductIdOptionsRaw(requestParameters: ProductsProductIdOptionsRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<void>> {
        if (requestParameters['productId'] == null) {
            throw new runtime.RequiredError(
                'productId',
                'Required parameter "productId" was null or undefined when calling productsProductIdOptions().'
            );
        }

        const queryParameters: any = {};

        const headerParameters: runtime.HTTPHeaders = {};


        let urlPath = `/products/{productId}`;
        urlPath = urlPath.replace(`{${"productId"}}`, encodeURIComponent(String(requestParameters['productId'])));

        const response = await this.request({
            path: urlPath,
            method: 'OPTIONS',
            headers: headerParameters,
            query: queryParameters,
        }, initOverrides);

        return new runtime.VoidApiResponse(response);
    }

    /**
     * Enable CORS by returning correct headers
     * CORS support
     */
    async productsProductIdOptions(requestParameters: ProductsProductIdOptionsRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<void> {
        await this.productsProductIdOptionsRaw(requestParameters, initOverrides);
    }

    /**
     * Update product
     * Update a product by ID
     */
    async updateProductRaw(requestParameters: UpdateProductRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<ProductDTO>> {
        if (requestParameters['productId'] == null) {
            throw new runtime.RequiredError(
                'productId',
                'Required parameter "productId" was null or undefined when calling updateProduct().'
            );
        }

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

        const queryParameters: any = {};

        const headerParameters: runtime.HTTPHeaders = {};

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


        let urlPath = `/products/{productId}`;
        urlPath = urlPath.replace(`{${"productId"}}`, encodeURIComponent(String(requestParameters['productId'])));

        const response = await this.request({
            path: urlPath,
            method: 'PATCH',
            headers: headerParameters,
            query: queryParameters,
            body: ProductDTOToJSON(requestParameters['productDTO']),
        }, initOverrides);

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

    /**
     * Update product
     * Update a product by ID
     */
    async updateProduct(requestParameters: UpdateProductRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<ProductDTO> {
        const response = await this.updateProductRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Update user
     * Update a user by ID
     */
    async updateUserRaw(requestParameters: UpdateUserRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<UserDTO>> {
        if (requestParameters['id'] == null) {
            throw new runtime.RequiredError(
                'id',
                'Required parameter "id" was null or undefined when calling updateUser().'
            );
        }

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

        const queryParameters: any = {};

        const headerParameters: runtime.HTTPHeaders = {};

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


        let urlPath = `/users/{id}`;
        urlPath = urlPath.replace(`{${"id"}}`, encodeURIComponent(String(requestParameters['id'])));

        const response = await this.request({
            path: urlPath,
            method: 'PATCH',
            headers: headerParameters,
            query: queryParameters,
            body: UserDTOToJSON(requestParameters['userDTO']),
        }, initOverrides);

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

    /**
     * Update user
     * Update a user by ID
     */
    async updateUser(requestParameters: UpdateUserRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<UserDTO> {
        const response = await this.updateUserRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Upload product asset
     * Upload a product asset
     */
    async uploadProductAssetRaw(requestParameters: UploadProductAssetRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<ProductDTO>> {
        if (requestParameters['productId'] == null) {
            throw new runtime.RequiredError(
                'productId',
                'Required parameter "productId" was null or undefined when calling uploadProductAsset().'
            );
        }

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

        const queryParameters: any = {};

        const headerParameters: runtime.HTTPHeaders = {};

        const consumes: runtime.Consume[] = [
            { contentType: 'multipart/form-data' },
        ];
        // @ts-ignore: canConsumeForm may be unused
        const canConsumeForm = runtime.canConsumeForm(consumes);

        let formParams: { append(param: string, value: any): any };
        let useForm = false;
        // use FormData to transmit files using content-type "multipart/form-data"
        useForm = canConsumeForm;
        if (useForm) {
            formParams = new FormData();
        } else {
            formParams = new URLSearchParams();
        }

        if (requestParameters['file'] != null) {
            formParams.append('file', requestParameters['file'] as any);
        }


        let urlPath = `/products/{productId}/asset`;
        urlPath = urlPath.replace(`{${"productId"}}`, encodeURIComponent(String(requestParameters['productId'])));

        const response = await this.request({
            path: urlPath,
            method: 'POST',
            headers: headerParameters,
            query: queryParameters,
            body: formParams,
        }, initOverrides);

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

    /**
     * Upload product asset
     * Upload a product asset
     */
    async uploadProductAsset(requestParameters: UploadProductAssetRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<ProductDTO> {
        const response = await this.uploadProductAssetRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Enable CORS by returning correct headers
     * CORS support
     */
    async usersIdOptionsRaw(requestParameters: UsersIdOptionsRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<void>> {
        if (requestParameters['id'] == null) {
            throw new runtime.RequiredError(
                'id',
                'Required parameter "id" was null or undefined when calling usersIdOptions().'
            );
        }

        const queryParameters: any = {};

        const headerParameters: runtime.HTTPHeaders = {};


        let urlPath = `/users/{id}`;
        urlPath = urlPath.replace(`{${"id"}}`, encodeURIComponent(String(requestParameters['id'])));

        const response = await this.request({
            path: urlPath,
            method: 'OPTIONS',
            headers: headerParameters,
            query: queryParameters,
        }, initOverrides);

        return new runtime.VoidApiResponse(response);
    }

    /**
     * Enable CORS by returning correct headers
     * CORS support
     */
    async usersIdOptions(requestParameters: UsersIdOptionsRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<void> {
        await this.usersIdOptionsRaw(requestParameters, initOverrides);
    }

    /**
     * Enable CORS by returning correct headers
     * CORS support
     */
    async usersOptionsRaw(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<void>> {
        const queryParameters: any = {};

        const headerParameters: runtime.HTTPHeaders = {};


        let urlPath = `/users`;

        const response = await this.request({
            path: urlPath,
            method: 'OPTIONS',
            headers: headerParameters,
            query: queryParameters,
        }, initOverrides);

        return new runtime.VoidApiResponse(response);
    }

    /**
     * Enable CORS by returning correct headers
     * CORS support
     */
    async usersOptions(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<void> {
        await this.usersOptionsRaw(initOverrides);
    }

}
