/*
 * Copyright (c) 2023 Huawei Device Co., Ltd.
 * Licensed 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.
 */
package ohos.hdi.secure_element.v1_0;

import ohos.hdi.secure_element.v1_0.ISecureElementCallback;
import ohos.hdi.secure_element.v1_0.SecureElementTypes;

/**
 * @brief Declares the APIs provided by the SecureElement module for obtaining SecureElement operations,
 * see "Open Mobile API Specification".
 *
 * @since 4.0
 * @version 1.0
 */
interface ISecureElementInterface {

    /**
     * Initializes the secure element.
     *
     * @param callback The callback used to notify the secure element status changed.
     * @param status The status code to initialize the secure element.
     * @since 4.0
     * @version 1.0
     */
    init([in] ISecureElementCallback clientCallback, [out] enum SecureElementStatus status);

    /**
     * Get the ATR of this SE.
     *
     * @return response The ATR or empty array SHALL be returned if the ATR for this SE is not available.
     * @since 4.0
     * @version 1.0
     */
    getAtr([out] List<unsigned char> response);

    /**
     * Checks if a SE is present in this reader.
     *
     * @param present True if the SE is present, false otherwise.
     */
    isSecureElementPresent([out] boolean present);

    /**
     * Open a logical channel with the SE, selecting the applet represented by the given AID (when the AID is not
     * Null and the length of the AID is not 0).
     *
     * @param aid The AID of the applet to be selected on this channel, as a byte array.
     * @param p2 The P2 parameter of the SELECT APDU executed on this channel.
     * @param response The response to SELECT command, or empty if failure.
     * @param channelNumber The channel number of new logical channel.
     * @param status The status code to open logical channel.
     */
    openLogicalChannel([in] List<unsigned char> aid, [in] unsigned char p2, [out] List<unsigned char> response,
        [out] unsigned char channelNumber, [out] enum SecureElementStatus status);

    /**
     * Get access to the basic channel, as defined in [ISO 7816-4] (the one that has number 0). The obtained object
     * is an instance of the channel class.
     *
     * @param aid The AID of the applet to be selected on this channel, as a byte array.
     * @param p2 The P2 parameter of the SELECT APDU executed on this channel.
     * @param response The response to SELECT command, or empty if failure.
     * @param status The status code to open basic channel.
     */
    openBasicChannel([in] List<unsigned char> aid, [in] unsigned char p2, [out] List<unsigned char> response,
        [out] enum SecureElementStatus status);

    /**
     * Closes this logical channel to the SE.
     * Closing a basic channel must return SecureElementStatus::FAILED.
     *
     * @param channelNumber The logical channel number to be closed
     * @param status The status code to close the logical channel.
     */
    closeChannel([in] unsigned char channelNumber, [out] enum SecureElementStatus status);

    /**
     * Transmit an APDU command (as per ISO/IEC 7816) to the SE.
     *
     * @param command The APDU command to be transmitted, as a byte array.
     * @param response The response received, as a byte array.
     * @param status The status code to transmit command.
     * @since 4.0
     * @version 1.0
     */
     transmit([in] List<unsigned char> command, [out] List<unsigned char> response, [out] enum SecureElementStatus status);

    /**
     * Transmit an APDU command (as per ISO/IEC 7816) to the SE.
     *
     * @param status The status code to reset the secure element.
     * @since 4.0
     * @version 1.0
     */
     reset([out] enum SecureElementStatus status);
}