/*
 * Copyright (C) 2021-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.
 */

#ifndef CELLULAR_CALL_STUB_H
#define CELLULAR_CALL_STUB_H

#include <map>

#include "cellular_call_data_struct.h"
#include "cellular_call_interface.h"
#include "cellular_call_ipc_interface_code.h"
#include "iremote_stub.h"
#include "telephony_log_wrapper.h"

namespace OHOS {
namespace Telephony {
class CellularCallStub : public IRemoteStub<CellularCallInterface> {
public:
    /**
     * CellularCallStub Constructors
     */
    CellularCallStub();

    /**
     * ~CellularCallStub Destructor
     */
    virtual ~CellularCallStub();

    /**
     * OnRemoteRequest
     *
     * @param code
     * @param data
     * @param reply
     * @param option
     * @return Returns TELEPHONY_SUCCESS on success, others on failure.
     */
    virtual int32_t OnRemoteRequest(
        uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option) override;

private:
    /**
     * On Dial Inner
     *
     * @param data send data
     * @param reply Received data
     * @return Returns TELEPHONY_SUCCESS on success, others on failure.
     */
    int32_t OnDialInner(MessageParcel &data, MessageParcel &reply);

    /**
     * On HangUp Inner
     *
     * @param data send data
     * @param reply Received data
     * @return Returns TELEPHONY_SUCCESS on success, others on failure.
     */
    int32_t OnHangUpInner(MessageParcel &data, MessageParcel &reply);

    /**
     * On Reject Inner
     *
     * @param data send data
     * @param reply Received data
     * @return Returns TELEPHONY_SUCCESS on success, others on failure.
     */
    int32_t OnRejectInner(MessageParcel &data, MessageParcel &reply);

    /**
     * On Answer Inner
     *
     * @param data send data
     * @param reply Received data
     * @return Returns TELEPHONY_SUCCESS on success, others on failure.
     */
    int32_t OnAnswerInner(MessageParcel &data, MessageParcel &reply);

    /**
     * On Is Emergency Call Inner
     *
     * @param data  send data
     * @param reply Received data
     * @return Returns TELEPHONY_SUCCESS on success, others on failure.
     */
    int32_t OnIsEmergencyPhoneNumberInner(MessageParcel &data, MessageParcel &reply);

    /**
     * On HoldCall Inner
     *
     * @param data send data
     * @param reply Received data
     * @return Returns TELEPHONY_SUCCESS on success, others on failure.
     */
    int32_t OnHoldCallInner(MessageParcel &data, MessageParcel &reply);

    /**
     * On UnHoldCall Inner
     *
     * @param data send data
     * @param reply Received data
     * @return Returns TELEPHONY_SUCCESS on success, others on failure.
     */
    int32_t OnUnHoldCallInner(MessageParcel &data, MessageParcel &reply);

    /**
     * On SwitchCall Inner
     *
     * @param data send data
     * @param reply Received data
     * @return Returns TELEPHONY_SUCCESS on success, others on failure.
     */
    int32_t OnSwitchCallInner(MessageParcel &data, MessageParcel &reply);

    /**
     * On CombineConference Inner
     *
     * @param data send data
     * @param reply Received data
     * @return Returns TELEPHONY_SUCCESS on success, others on failure.
     */
    int32_t OnCombineConferenceInner(MessageParcel &data, MessageParcel &reply);

    /**
     * On SeparateConference Inner
     *
     * @param data send data
     * @param reply Received data
     * @return Returns TELEPHONY_SUCCESS on success, others on failure.
     */
    int32_t OnSeparateConferenceInner(MessageParcel &data, MessageParcel &reply);

    /**
     * On InviteToConference Inner
     *
     * @param data send data
     * @param reply Received data
     * @return Returns TELEPHONY_SUCCESS on success, others on failure.
     */
    int32_t OnInviteToConferenceInner(MessageParcel &data, MessageParcel &reply);

    /**
     * On KickOutFromConference Inner
     *
     * @param data send data
     * @param reply Received data
     * @return Returns TELEPHONY_SUCCESS on success, others on failure.
     */
    int32_t OnKickOutFromConferenceInner(MessageParcel &data, MessageParcel &reply);

    /**
     * On HangUpAllConnection Inner
     *
     * @param data send data
     * @param reply Received data
     * @return Returns TELEPHONY_SUCCESS on success, others on failure.
     */
    int32_t OnHangUpAllConnectionInner(MessageParcel &data, MessageParcel &reply);

    int32_t OnSetReadyToCallInner(MessageParcel &data, MessageParcel &reply);

    /**
     * On SendUpdateCallMediaModeRequest Inner
     *
     * @param data send data
     * @param reply Received data
     * @return Returns TELEPHONY_SUCCESS on success, others on failure.
     */
    int32_t OnSendUpdateCallMediaModeRequestInner(MessageParcel &data, MessageParcel &reply);

    /**
     * On SendUpdateCallMediaModeResponse Inner
     *
     * @param data send data
     * @param reply Received data
     * @return Returns TELEPHONY_SUCCESS on success, others on failure.
     */
    int32_t OnSendUpdateCallMediaModeResponseInner(MessageParcel &data, MessageParcel &reply);

    /**
     * On Cancel Call Upgrade Inner
     *
     * @param data send data
     * @param reply Received data
     * @return Returns TELEPHONY_SUCCESS on success, others on failure.
     */
    int32_t OnCancelCallUpgradeInner(MessageParcel &data, MessageParcel &reply);

    /**
     * On Request Camera Capabilities Inner
     *
     * @param data send data
     * @param reply Received data
     * @return Returns TELEPHONY_SUCCESS on success, others on failure.
     */
    int32_t OnRequestCameraCapabilitiesInner(MessageParcel &data, MessageParcel &reply);

    /**
     * On Register Call Back Inner
     *
     * @param data send data
     * @param reply Received data
     * @return Returns TELEPHONY_SUCCESS on success, others on failure.
     */
    int32_t OnRegisterCallBackInner(MessageParcel &data, MessageParcel &reply);

    /**
     * On UnRegister Call Back Inner
     *
     * @param data send data
     * @param reply Received data
     * @return Returns TELEPHONY_SUCCESS on success, others on failure.
     */
    int32_t OnUnRegisterCallBackInner(MessageParcel &data, MessageParcel &reply);

    /**
     * On start Dtmf Inner
     *
     * @param data send data
     * @param reply Received data
     * @return Returns TELEPHONY_SUCCESS on success, others on failure.
     */
    int32_t OnStartDtmfInner(MessageParcel &data, MessageParcel &reply);

    /**
     * On stop Dtmf Inner
     *
     * @param data send data
     * @param reply Received data
     * @return Returns TELEPHONY_SUCCESS on success, others on failure.
     */
    int32_t OnStopDtmfInner(MessageParcel &data, MessageParcel &reply);

    int32_t OnPostDialProceedInner(MessageParcel &data, MessageParcel &reply);

    /**
     * On send Dtmf Inner
     *
     * @param data send data
     * @param reply Received data
     * @return Returns TELEPHONY_SUCCESS on success, others on failure.
     */
    int32_t OnSendDtmfInner(MessageParcel &data, MessageParcel &reply);

#ifdef SUPPORT_RTT_CALL
    /**
     * On RTT Call Moidfy
     *
     * @param data send data
     * @param reply Received data
     * @return Returns TELEPHONY_SUCCESS on success, others on failure.
     */
    int32_t OnUpdateImsRttCallModeInner(MessageParcel &data, MessageParcel &reply);

    /**
     * On Set VT Capability When RTT Setting Changed
     *
     * @param data send data
     * @param reply Received data
     * @return Returns TELEPHONY_SUCCESS on success, others on failure.
     */
    int32_t OnSetRttCapabilityInner(MessageParcel &data, MessageParcel &reply);
#endif

    /**
     * On Set Call Transfer Inner
     *
     * @param data send data
     * @param reply Received data
     * @return Returns TELEPHONY_SUCCESS on success, others on failure.
     */
    int32_t OnSetCallTransferInner(MessageParcel &data, MessageParcel &reply);

    /**
     * confirm whether IMS can set call transfer time.
     *
     * @param data send data
     * @param reply Received data
     * @return Returns TELEPHONY_SUCCESS on success, others on failure.
     */
    int32_t OnCanSetCallTransferTimeInner(MessageParcel &data, MessageParcel &reply);

    /**
     * On Inquire Call Transfer Inner
     *
     * @param data send data
     * @param reply Received data
     * @return Returns TELEPHONY_SUCCESS on success, others on failure.
     */
    int32_t OnGetCallTransferInner(MessageParcel &data, MessageParcel &reply);

    /**
     * On Set Call Waiting
     *
     * @param data  send data
     * @param reply Received data
     * @return Returns TELEPHONY_SUCCESS on success, others on failure.
     */
    int32_t OnSetCallWaitingInner(MessageParcel &data, MessageParcel &reply);

    /**
     * On Inquire Call Waiting
     *
     * @param data  send data
     * @param reply Received data
     * @return Returns TELEPHONY_SUCCESS on success, others on failure.
     */
    int32_t OnGetCallWaitingInner(MessageParcel &data, MessageParcel &reply);

    /**
     * On Inquire video Call Waiting
     *
     * @param data  send data
     * @param reply Received data
     * @return Returns TELEPHONY_SUCCESS on success, others on failure.
     */
    int32_t OnGetVideoCallWaitingInner(MessageParcel &data, MessageParcel &reply);

    /**
     * On Set Call Restriction
     *
     * @param data send data
     * @param reply Received data
     * @return Returns TELEPHONY_SUCCESS on success, others on failure.
     */
    int32_t OnSetCallRestrictionInner(MessageParcel &data, MessageParcel &reply);

    /**
     * On Get Call Restriction
     *
     * @param data send data
     * @param reply Received data
     * @return Returns TELEPHONY_SUCCESS on success, others on failure.
     */
    int32_t OnGetCallRestrictionInner(MessageParcel &data, MessageParcel &reply);

    /**
     * On Set Call Restriction Password
     *
     * @param data send data
     * @param reply Received data
     * @return Returns TELEPHONY_SUCCESS on success, others on failure.
     */
    int32_t OnSetCallRestrictionPasswordInner(MessageParcel &data, MessageParcel &reply);

    /**
     * On Set Domain Preference Mode
     *
     * @param data send data
     * @param reply Received data
     * @return Returns TELEPHONY_SUCCESS on success, others on failure.
     */
    int32_t OnSetDomainPreferenceModeInner(MessageParcel &data, MessageParcel &reply);

    /**
     * On Get Domain Preference Mode
     *
     * @param data send data
     * @param reply Received data
     * @return Returns TELEPHONY_SUCCESS on success, others on failure.
     */
    int32_t OnGetDomainPreferenceModeInner(MessageParcel &data, MessageParcel &reply);

    /**
     * On Set Ims Switch Status
     *
     * @param data send data
     * @param reply Received data
     * @return Returns TELEPHONY_SUCCESS on success, others on failure.
     */
    int32_t OnSetImsSwitchStatusInner(MessageParcel &data, MessageParcel &reply);

    /**
     * On Get Carrier Vt Config
     *
     * @param data send data
     * @param reply Received data
     * @return Returns TELEPHONY_SUCCESS on success, others on failure.
     */
    int32_t OnGetCarrierVtConfigInner(MessageParcel &data, MessageParcel &reply);

    /**
     * On Get Ims Switch Status
     *
     * @param data send data
     * @param reply Received data
     * @return Returns TELEPHONY_SUCCESS on success, others on failure.
     */
    int32_t OnGetImsSwitchStatusInner(MessageParcel &data, MessageParcel &reply);

    /**
     * On Set VoNR Switch Status
     *
     * @param data send data
     * @param reply received data
     * @return Returns TELEPHONY_SUCCESS on success, others on failure.
     */
    int32_t OnSetVoNRStateInner(MessageParcel &data, MessageParcel &reply);

    /**
     * On Get VoNR Switch Status
     *
     * @param data send data
     * @param reply received data
     * @return Returns TELEPHONY_SUCCESS on success, others on failure.
     */
    int32_t OnGetVoNRStateInner(MessageParcel &data, MessageParcel &reply);

    /**
     * On SetImsConfigStringInner
     *
     * @param data send data
     * @param reply Received data
     * @return Returns TELEPHONY_SUCCESS on success, others on failure.
     */
    int32_t OnSetImsConfigStringInner(MessageParcel &data, MessageParcel &reply);

    /**
     * On SetImsConfigIntInner
     *
     * @param data send data
     * @param reply Received data
     * @return Returns TELEPHONY_SUCCESS on success, others on failure.
     */
    int32_t OnSetImsConfigIntInner(MessageParcel &data, MessageParcel &reply);

    /**
     * On GetImsConfigInner
     *
     * @param data send data
     * @param reply Received data
     * @return Returns TELEPHONY_SUCCESS on success, others on failure.
     */
    int32_t OnGetImsConfigInner(MessageParcel &data, MessageParcel &reply);

    /**
     * On SetImsFeatureValueInner
     *
     * @param data send data
     * @param reply Received data
     * @return Returns TELEPHONY_SUCCESS on success, others on failure.
     */
    int32_t OnSetImsFeatureValueInner(MessageParcel &data, MessageParcel &reply);

    /**
     * On GetImsFeatureValueInner
     *
     * @param data send data
     * @param reply Received data
     * @return Returns TELEPHONY_SUCCESS on success, others on failure.
     */
    int32_t OnGetImsFeatureValueInner(MessageParcel &data, MessageParcel &reply);

    /**
     * On Control Camera Inner
     *
     * @param data send data
     * @param reply Received data
     * @return Returns TELEPHONY_SUCCESS on success, others on failure.
     */
    int32_t OnControlCameraInner(MessageParcel &data, MessageParcel &reply);

    /**
     * On Set Preview Window Inner
     *
     * @param data send data
     * @param reply Received data
     * @return Returns TELEPHONY_SUCCESS on success, others on failure.
     */
    int32_t OnSetPreviewWindowInner(MessageParcel &data, MessageParcel &reply);

    /**
     * On Set Display Window Inner
     *
     * @param data send data
     * @param reply Received data
     * @return Returns TELEPHONY_SUCCESS on success, others on failure.
     */
    int32_t OnSetDisplayWindowInner(MessageParcel &data, MessageParcel &reply);

    /**
     * On Set Camera Zoom Inner
     *
     * @param data send data
     * @param reply Received data
     * @return Returns TELEPHONY_SUCCESS on success, others on failure.
     */
    int32_t OnSetCameraZoomInner(MessageParcel &data, MessageParcel &reply);

    /**
     * On Set Pause Picture Inner
     *
     * @param data send data
     * @param reply Received data
     * @return Returns TELEPHONY_SUCCESS on success, others on failure.
     */
    int32_t OnSetPausePictureInner(MessageParcel &data, MessageParcel &reply);

    /**
     * On Set Device Direction Inner
     *
     * @param data send data
     * @param reply Received data
     * @return Returns TELEPHONY_SUCCESS on success, others on failure.
     */
    int32_t OnSetDeviceDirectionInner(MessageParcel &data, MessageParcel &reply);

    /**
     * On Set Mute Inner
     *
     * @param data send data
     * @param reply Received data
     * @return Returns TELEPHONY_SUCCESS on success, others on failure.
     */
    int32_t OnSetMuteInner(MessageParcel &data, MessageParcel &reply);

    /**
     * On Get Mute Inner
     *
     * @param data send data
     * @param reply Received data
     * @return Returns TELEPHONY_SUCCESS on success, others on failure.
     */
    int32_t OnGetMuteInner(MessageParcel &data, MessageParcel &reply);

    /**
     * Close Unfinished ussd
     *
     * @brief Close Unfinished ussd function for the current account
     * @param slotId[in], The slot id
     * @return Returns 0 on success, others on failure.
     */
    int32_t OnCloseUnFinishedUssdInner(MessageParcel &data, MessageParcel &reply);

    /**
     * @brief clear all call if cellular call service restart
     *
     * @param infos[in] the call detail info vector which contains phone number, call type, slot id .etc
     * @return Returns TELEPHONY_SUCCESS on success, others on failure.
     */
    int32_t OnClearAllCallsInner(MessageParcel &data, MessageParcel &reply);

    int32_t OnSetEmergencyCallList(MessageParcel &data, MessageParcel &reply);

    /**
     * Send ussd response to modem
     *
     * @brief Send ussd response to modem
     * @param slotId[in], The slot id
     * @param  content the content need send to modem
     * @return Returns TELEPHONY_SUCCESS on success, others on failure.
     */
    int32_t OnSendUssdResponse(MessageParcel &data, MessageParcel &reply);

    /**
     * Is mmi code
     *
     * @brief Is mmi code
     * @param data send data
     * @param reply Received data
     * @return Returns TELEPHONY_SUCCESS on success, others on failure.
     */
    int32_t OnIsMmiCodeInner(MessageParcel &data, MessageParcel &reply);

private:
    using RequestFuncType = std::function<int32_t(MessageParcel &data, MessageParcel &reply)>;
    std::map<CellularCallInterfaceCode, RequestFuncType> requestFuncMap_;
    void InitFuncMap();
    void InitDialFuncMap();
    void InitDtmfFuncMap();
    void InitConfigFuncMap();
    void InitVideoFuncMap();
    void InitSupplementFuncMap();
};
} // namespace Telephony
} // namespace OHOS

#endif // CELLULAR_CALL_STUB_H