/**
 * Copyright (c) 2020, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
 *
 * WSO2 Inc. licenses this file to you under the Apache License,
 * Version 2.0 (the "License"); you may not use this file except
 * in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied. See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

import {
    AUTH_CODE,
    CHECK_SESSION_SIGNED_IN,
    CHECK_SESSION_SIGNED_OUT,
    DISABLE_HTTP_HANDLER,
    ENABLE_HTTP_HANDLER,
    END_USER_SESSION,
    GET_AUTH_URL,
    GET_BASIC_USER_INFO,
    GET_CONFIG_DATA,
    GET_CRYPTO_HELPER,
    GET_DECODED_IDP_ID_TOKEN,
    GET_DECODED_ID_TOKEN,
    GET_ID_TOKEN,
    GET_OIDC_SERVICE_ENDPOINTS,
    GET_SIGN_OUT_URL,
    HTTP_REQUEST,
    HTTP_REQUEST_ALL,
    INIT,
    IS_AUTHENTICATED,
    REFRESH_ACCESS_TOKEN,
    REFRESH_ACCESS_TOKEN_ERR0R,
    REQUEST_ACCESS_TOKEN,
    REQUEST_CUSTOM_GRANT,
    REQUEST_ERROR,
    REQUEST_FINISH,
    REQUEST_START,
    REQUEST_SUCCESS,
    REVOKE_ACCESS_TOKEN,
    SET_SESSION_STATE,
    SET_SESSION_STATE_FROM_IFRAME,
    SIGN_IN,
    SIGN_OUT,
    START_AUTO_REFRESH_TOKEN,
    UPDATE_CONFIG
} from "../constants";

export interface ResponseMessage<T> {
    success: boolean;
    error?: string;
    data?: T;
    blob?: Blob;
}

export interface Message<T> {
    type: MessageType;
    data?: T;
}

export interface AuthorizationInfo {
    code: string;
    sessionState: string;
    pkce?: string;
    state: string;
    tokenRequestConfig?: {
        params: Record<string, unknown>
    }
}

export type MessageType =
    | typeof INIT
    | typeof SIGN_IN
    | typeof AUTH_CODE
    | typeof SIGN_OUT
    | typeof HTTP_REQUEST
    | typeof HTTP_REQUEST_ALL
    | typeof REQUEST_CUSTOM_GRANT
    | typeof REVOKE_ACCESS_TOKEN
    | typeof END_USER_SESSION
    | typeof REQUEST_ERROR
    | typeof REQUEST_FINISH
    | typeof REQUEST_START
    | typeof REQUEST_SUCCESS
    | typeof GET_OIDC_SERVICE_ENDPOINTS
    | typeof GET_BASIC_USER_INFO
    | typeof GET_DECODED_ID_TOKEN
    | typeof GET_CRYPTO_HELPER
    | typeof GET_DECODED_IDP_ID_TOKEN
    | typeof ENABLE_HTTP_HANDLER
    | typeof DISABLE_HTTP_HANDLER
    | typeof GET_AUTH_URL
    | typeof REQUEST_ACCESS_TOKEN
    | typeof IS_AUTHENTICATED
    | typeof GET_SIGN_OUT_URL
    | typeof REFRESH_ACCESS_TOKEN
    | typeof REFRESH_ACCESS_TOKEN_ERR0R
    | typeof SET_SESSION_STATE
    | typeof START_AUTO_REFRESH_TOKEN
    | typeof UPDATE_CONFIG
    | typeof GET_ID_TOKEN
    | typeof CHECK_SESSION_SIGNED_IN
    | typeof CHECK_SESSION_SIGNED_OUT
    | typeof GET_CONFIG_DATA
    | typeof SET_SESSION_STATE_FROM_IFRAME;

export interface CommunicationHelperInterface {
    communicate: <T, R>(message: Message<T>) => Promise<R>;
}

export interface AuthorizationResponse {
    authorizationURL: string;
    pkce?: string;
}
