/* tslint:disable */
/* eslint-disable */
/**
 * authentik
 * Making authentication simple.
 *
 * The version of the OpenAPI document: 2026.5.0-rc1
 * Contact: hello@goauthentik.io
 *
 * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
 * https://openapi-generator.tech
 * Do not edit the class manually.
 */

import type { AuthorizationCodeAuthMethodEnum } from "./AuthorizationCodeAuthMethodEnum";
import {
    AuthorizationCodeAuthMethodEnumFromJSON,
    AuthorizationCodeAuthMethodEnumToJSON,
} from "./AuthorizationCodeAuthMethodEnum";
import type { GroupMatchingModeEnum } from "./GroupMatchingModeEnum";
import {
    GroupMatchingModeEnumFromJSON,
    GroupMatchingModeEnumToJSON,
} from "./GroupMatchingModeEnum";
import type { PKCEMethodEnum } from "./PKCEMethodEnum";
import { PKCEMethodEnumFromJSON, PKCEMethodEnumToJSON } from "./PKCEMethodEnum";
import type { PolicyEngineMode } from "./PolicyEngineMode";
import { PolicyEngineModeFromJSON, PolicyEngineModeToJSON } from "./PolicyEngineMode";
import type { ProviderTypeEnum } from "./ProviderTypeEnum";
import { ProviderTypeEnumFromJSON, ProviderTypeEnumToJSON } from "./ProviderTypeEnum";
import type { UserMatchingModeEnum } from "./UserMatchingModeEnum";
import { UserMatchingModeEnumFromJSON, UserMatchingModeEnumToJSON } from "./UserMatchingModeEnum";

/**
 * OAuth Source Serializer
 * @export
 * @interface OAuthSourceRequest
 */
export interface OAuthSourceRequest {
    /**
     * Source's display Name.
     * @type {string}
     * @memberof OAuthSourceRequest
     */
    name: string;
    /**
     * Internal source name, used in URLs.
     * @type {string}
     * @memberof OAuthSourceRequest
     */
    slug: string;
    /**
     *
     * @type {boolean}
     * @memberof OAuthSourceRequest
     */
    enabled?: boolean;
    /**
     * When enabled, this source will be displayed as a prominent button on the login page, instead of a small icon.
     * @type {boolean}
     * @memberof OAuthSourceRequest
     */
    promoted?: boolean;
    /**
     * Flow to use when authenticating existing users.
     * @type {string}
     * @memberof OAuthSourceRequest
     */
    authenticationFlow?: string | null;
    /**
     * Flow to use when enrolling new users.
     * @type {string}
     * @memberof OAuthSourceRequest
     */
    enrollmentFlow?: string | null;
    /**
     *
     * @type {Array<string>}
     * @memberof OAuthSourceRequest
     */
    userPropertyMappings?: Array<string>;
    /**
     *
     * @type {Array<string>}
     * @memberof OAuthSourceRequest
     */
    groupPropertyMappings?: Array<string>;
    /**
     *
     * @type {PolicyEngineMode}
     * @memberof OAuthSourceRequest
     */
    policyEngineMode?: PolicyEngineMode;
    /**
     * How the source determines if an existing user should be authenticated or a new user enrolled.
     * @type {UserMatchingModeEnum}
     * @memberof OAuthSourceRequest
     */
    userMatchingMode?: UserMatchingModeEnum;
    /**
     *
     * @type {string}
     * @memberof OAuthSourceRequest
     */
    userPathTemplate?: string;
    /**
     *
     * @type {string}
     * @memberof OAuthSourceRequest
     */
    icon?: string;
    /**
     * How the source determines if an existing group should be used or a new group created.
     * @type {GroupMatchingModeEnum}
     * @memberof OAuthSourceRequest
     */
    groupMatchingMode?: GroupMatchingModeEnum;
    /**
     *
     * @type {ProviderTypeEnum}
     * @memberof OAuthSourceRequest
     */
    providerType: ProviderTypeEnum;
    /**
     * URL used to request the initial token. This URL is only required for OAuth 1.
     * @type {string}
     * @memberof OAuthSourceRequest
     */
    requestTokenUrl?: string | null;
    /**
     * URL the user is redirect to to conest the flow.
     * @type {string}
     * @memberof OAuthSourceRequest
     */
    authorizationUrl?: string | null;
    /**
     * URL used by authentik to retrieve tokens.
     * @type {string}
     * @memberof OAuthSourceRequest
     */
    accessTokenUrl?: string | null;
    /**
     * URL used by authentik to get user information.
     * @type {string}
     * @memberof OAuthSourceRequest
     */
    profileUrl?: string | null;
    /**
     *
     * @type {PKCEMethodEnum}
     * @memberof OAuthSourceRequest
     */
    pkce?: PKCEMethodEnum;
    /**
     *
     * @type {string}
     * @memberof OAuthSourceRequest
     */
    consumerKey: string;
    /**
     *
     * @type {string}
     * @memberof OAuthSourceRequest
     */
    consumerSecret: string;
    /**
     *
     * @type {string}
     * @memberof OAuthSourceRequest
     */
    additionalScopes?: string;
    /**
     *
     * @type {string}
     * @memberof OAuthSourceRequest
     */
    oidcWellKnownUrl?: string;
    /**
     *
     * @type {string}
     * @memberof OAuthSourceRequest
     */
    oidcJwksUrl?: string;
    /**
     *
     * @type {{ [key: string]: any; }}
     * @memberof OAuthSourceRequest
     */
    oidcJwks?: { [key: string]: any };
    /**
     * How to perform authentication during an authorization_code token request flow
     * @type {AuthorizationCodeAuthMethodEnum}
     * @memberof OAuthSourceRequest
     */
    authorizationCodeAuthMethod?: AuthorizationCodeAuthMethodEnum;
}

/**
 * Check if a given object implements the OAuthSourceRequest interface.
 */
export function instanceOfOAuthSourceRequest(value: object): value is OAuthSourceRequest {
    if (!("name" in value) || value["name"] === undefined) return false;
    if (!("slug" in value) || value["slug"] === undefined) return false;
    if (!("providerType" in value) || value["providerType"] === undefined) return false;
    if (!("consumerKey" in value) || value["consumerKey"] === undefined) return false;
    if (!("consumerSecret" in value) || value["consumerSecret"] === undefined) return false;
    return true;
}

export function OAuthSourceRequestFromJSON(json: any): OAuthSourceRequest {
    return OAuthSourceRequestFromJSONTyped(json, false);
}

export function OAuthSourceRequestFromJSONTyped(
    json: any,
    ignoreDiscriminator: boolean,
): OAuthSourceRequest {
    if (json == null) {
        return json;
    }
    return {
        name: json["name"],
        slug: json["slug"],
        enabled: json["enabled"] == null ? undefined : json["enabled"],
        promoted: json["promoted"] == null ? undefined : json["promoted"],
        authenticationFlow:
            json["authentication_flow"] == null ? undefined : json["authentication_flow"],
        enrollmentFlow: json["enrollment_flow"] == null ? undefined : json["enrollment_flow"],
        userPropertyMappings:
            json["user_property_mappings"] == null ? undefined : json["user_property_mappings"],
        groupPropertyMappings:
            json["group_property_mappings"] == null ? undefined : json["group_property_mappings"],
        policyEngineMode:
            json["policy_engine_mode"] == null
                ? undefined
                : PolicyEngineModeFromJSON(json["policy_engine_mode"]),
        userMatchingMode:
            json["user_matching_mode"] == null
                ? undefined
                : UserMatchingModeEnumFromJSON(json["user_matching_mode"]),
        userPathTemplate:
            json["user_path_template"] == null ? undefined : json["user_path_template"],
        icon: json["icon"] == null ? undefined : json["icon"],
        groupMatchingMode:
            json["group_matching_mode"] == null
                ? undefined
                : GroupMatchingModeEnumFromJSON(json["group_matching_mode"]),
        providerType: ProviderTypeEnumFromJSON(json["provider_type"]),
        requestTokenUrl: json["request_token_url"] == null ? undefined : json["request_token_url"],
        authorizationUrl: json["authorization_url"] == null ? undefined : json["authorization_url"],
        accessTokenUrl: json["access_token_url"] == null ? undefined : json["access_token_url"],
        profileUrl: json["profile_url"] == null ? undefined : json["profile_url"],
        pkce: json["pkce"] == null ? undefined : PKCEMethodEnumFromJSON(json["pkce"]),
        consumerKey: json["consumer_key"],
        consumerSecret: json["consumer_secret"],
        additionalScopes: json["additional_scopes"] == null ? undefined : json["additional_scopes"],
        oidcWellKnownUrl:
            json["oidc_well_known_url"] == null ? undefined : json["oidc_well_known_url"],
        oidcJwksUrl: json["oidc_jwks_url"] == null ? undefined : json["oidc_jwks_url"],
        oidcJwks: json["oidc_jwks"] == null ? undefined : json["oidc_jwks"],
        authorizationCodeAuthMethod:
            json["authorization_code_auth_method"] == null
                ? undefined
                : AuthorizationCodeAuthMethodEnumFromJSON(json["authorization_code_auth_method"]),
    };
}

export function OAuthSourceRequestToJSON(json: any): OAuthSourceRequest {
    return OAuthSourceRequestToJSONTyped(json, false);
}

export function OAuthSourceRequestToJSONTyped(
    value?: OAuthSourceRequest | null,
    ignoreDiscriminator: boolean = false,
): any {
    if (value == null) {
        return value;
    }

    return {
        name: value["name"],
        slug: value["slug"],
        enabled: value["enabled"],
        promoted: value["promoted"],
        authentication_flow: value["authenticationFlow"],
        enrollment_flow: value["enrollmentFlow"],
        user_property_mappings: value["userPropertyMappings"],
        group_property_mappings: value["groupPropertyMappings"],
        policy_engine_mode: PolicyEngineModeToJSON(value["policyEngineMode"]),
        user_matching_mode: UserMatchingModeEnumToJSON(value["userMatchingMode"]),
        user_path_template: value["userPathTemplate"],
        icon: value["icon"],
        group_matching_mode: GroupMatchingModeEnumToJSON(value["groupMatchingMode"]),
        provider_type: ProviderTypeEnumToJSON(value["providerType"]),
        request_token_url: value["requestTokenUrl"],
        authorization_url: value["authorizationUrl"],
        access_token_url: value["accessTokenUrl"],
        profile_url: value["profileUrl"],
        pkce: PKCEMethodEnumToJSON(value["pkce"]),
        consumer_key: value["consumerKey"],
        consumer_secret: value["consumerSecret"],
        additional_scopes: value["additionalScopes"],
        oidc_well_known_url: value["oidcWellKnownUrl"],
        oidc_jwks_url: value["oidcJwksUrl"],
        oidc_jwks: value["oidcJwks"],
        authorization_code_auth_method: AuthorizationCodeAuthMethodEnumToJSON(
            value["authorizationCodeAuthMethod"],
        ),
    };
}
