/*
 * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
 * @generated-id: 9f36648384bd
 */
import { encodeJSON, encodeSimple } from "../lib/encodings.js";
import { compactMap } from "../lib/primitives.js";
import { safeParse } from "../lib/schemas.js";
import { extractSecurity, resolveGlobalSecurity } from "../lib/security.js";
import { pathToFunc } from "../lib/url.js";
import { AssignFolderRolesRequestRequest$zodSchema, } from "../models/assignfolderrolesop.js";
import { APIPromise } from "../types/async.js";
/**
 * Assign folder roles
 *
 * @remarks
 * Assigns or removes folder roles for a principal (user, group, or API key).
 * Supports all system folder roles (see [System roles reference](https://cloudinary.com/documentation/permissions_system_roles_policies#folder_roles)).
 * Enterprise customers can also assign custom roles by ID.
 * Note: Assigning roles to users or groups via this endpoint requires their user or group IDs, which are available through the Provisioning API (Enterprise only). Free customers can use this endpoint to assign roles only to API keys, but can assign folder roles to users and groups through the UI.
 */
export function foldersAssignFolderRoles(client$, folder_id, assign_folder_roles_request, options) {
    return new APIPromise($do(client$, folder_id, assign_folder_roles_request, options));
}
async function $do(client$, folder_id, assign_folder_roles_request, options) {
    const input$ = {
        folder_id: folder_id,
        assign_folder_roles_request: assign_folder_roles_request,
    };
    const parsed$ = safeParse(input$, (value$) => AssignFolderRolesRequestRequest$zodSchema.parse(value$), "Input validation failed");
    if (!parsed$.ok) {
        return [parsed$, { status: "invalid" }];
    }
    const payload$ = parsed$.value;
    const body$ = encodeJSON("body", payload$.assign_folder_roles_request, {
        explode: true,
    });
    const pathParams$ = {
        cloud_name: encodeSimple("cloud_name", client$._options.cloud_name, {
            explode: false,
            charEncoding: "percent",
        }),
        folder_id: encodeSimple("folder_id", payload$.folder_id, {
            explode: false,
            charEncoding: "percent",
        }),
    };
    const path$ = pathToFunc("/v1_1/{cloud_name}/folder_operations/invite/{folder_id}")(pathParams$);
    const headers$ = new Headers(compactMap({
        "Content-Type": "application/json",
        Accept: "application/json",
    }));
    const securityInput = await extractSecurity(client$._options.security);
    const requestSecurity = resolveGlobalSecurity(securityInput);
    const context = {
        options: client$._options,
        baseURL: options?.serverURL ?? client$._baseURL ?? "",
        operationID: "assignFolderRoles",
        oAuth2Scopes: null,
        resolvedSecurity: requestSecurity,
        securitySource: client$._options.security,
        retryConfig: options?.retries
            || client$._options.retryConfig
            || { strategy: "none" },
        retryCodes: options?.retryCodes || [
            "429",
            "500",
            "502",
            "503",
            "504",
        ],
    };
    const requestRes = client$._createRequest(context, {
        security: requestSecurity,
        method: "POST",
        baseURL: options?.serverURL,
        path: path$,
        headers: headers$,
        body: body$,
        userAgent: client$._options.userAgent,
        timeoutMs: options?.timeoutMs || client$._options.timeoutMs
            || -1,
    }, options);
    if (!requestRes.ok) {
        return [requestRes, { status: "invalid" }];
    }
    const req$ = requestRes.value;
    const doResult = await client$._do(req$, {
        context,
        errorCodes: [],
        retryConfig: context.retryConfig,
        retryCodes: context.retryCodes,
    });
    if (!doResult.ok) {
        return [doResult, { status: "request-error", request: req$ }];
    }
    return [doResult, {
            status: "complete",
            "request": req$,
            response: doResult.value,
        }];
}
//# sourceMappingURL=foldersAssignFolderRoles.js.map