/*
 * Copyright (c) 2022 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 OHOS_HDI_RIL_V1_0_RIL_INTERFACE_IMPL_H
#define OHOS_HDI_RIL_V1_0_RIL_INTERFACE_IMPL_H

#include "hril_manager.h"

#include <hdf_log.h>
#include <iproxy_broker.h>
#include <iremote_object.h>

#include "v1_3/iril.h"
#include "vector"

namespace OHOS {
namespace HDI {
namespace Ril {
namespace V1_3 {
class RilImpl : public IRil {
public:
    RilImpl() = default;
    virtual ~RilImpl() = default;

    // Call
    int32_t SetEmergencyCallList(int32_t slotId, int32_t serialId, const EmergencyInfoList &emergencyInfoList) override;
    int32_t GetEmergencyCallList(int32_t slotId, int32_t serialId) override;
    int32_t GetCallList(int32_t slotId, int32_t serialId) override;
    int32_t Dial(int32_t slotId, int32_t serialId, const DialInfo &dialInfo) override;
    int32_t Reject(int32_t slotId, int32_t serialId) override;
    int32_t Hangup(int32_t slotId, int32_t serialId, int32_t gsmIndex) override;
    int32_t Answer(int32_t slotId, int32_t serialId) override;
    int32_t HoldCall(int32_t slotId, int32_t serialId) override;
    int32_t UnHoldCall(int32_t slotId, int32_t serialId) override;
    int32_t SwitchCall(int32_t slotId, int32_t serialId) override;
    int32_t CombineConference(int32_t slotId, int32_t serialId, int32_t callType) override;
    int32_t SeparateConference(int32_t slotId, int32_t serialId, int32_t callIndex, int32_t callType) override;
    int32_t GetCallWaiting(int32_t slotId, int32_t serialId) override;
    int32_t SetCallWaiting(int32_t slotId, int32_t serialId, int32_t activate) override;
    int32_t GetCallTransferInfo(int32_t slotId, int32_t serialId, int32_t reason) override;
    int32_t SetCallTransferInfo(
        int32_t slotId, int32_t serialId, const CallForwardSetInfo &callForwardSetInfo) override;
    int32_t GetCallRestriction(int32_t slotId, int32_t serialId, const std::string &fac) override;
    int32_t SetCallRestriction(
        int32_t slotId, int32_t serialId, const CallRestrictionInfo &callRestrictionInfo) override;
    int32_t GetClip(int32_t slotId, int32_t serialId) override;
    int32_t SetClip(int32_t slotId, int32_t serialId, int32_t action) override;
    int32_t GetClir(int32_t slotId, int32_t serialId) override;
    int32_t SetClir(int32_t slotId, int32_t serialId, int32_t action) override;
    int32_t SetCallPreferenceMode(int32_t slotId, int32_t serialId, int32_t mode) override;
    int32_t GetCallPreferenceMode(int32_t slotId, int32_t serialId) override;
    int32_t SetUssd(int32_t slotId, int32_t serialId, const std::string &str) override;
    int32_t CloseUnFinishedUssd(int32_t slotId, int32_t serialId) override;
    int32_t GetUssd(int32_t slotId, int32_t serialId) override;
    int32_t SetMute(int32_t slotId, int32_t serialId, int32_t mute) override;
    int32_t GetMute(int32_t slotId, int32_t serialId) override;
    int32_t GetCallFailReason(int32_t slotId, int32_t serialId) override;
    int32_t CallSupplement(int32_t slotId, int32_t serialId, int32_t type) override;
    int32_t SendDtmf(int32_t slotId, int32_t serialId, const DtmfInfo &dtmfInfo) override;
    int32_t StartDtmf(int32_t slotId, int32_t serialId, const DtmfInfo &dtmfInfo) override;
    int32_t StopDtmf(int32_t slotId, int32_t serialId, const DtmfInfo &dtmfInfo) override;
    int32_t SetBarringPassword(int32_t slotId, int32_t serialId, const SetBarringInfo &setBarringInfo) override;
    int32_t SetVonrSwitch(int32_t slotId, int32_t serialId, int32_t status) override;

    // Data
    int32_t ActivatePdpContext(int32_t slotId, int32_t serialId, const DataCallInfo &dataCallInfo) override;
    int32_t ActivatePdpContextWithApnTypes(int32_t slotId, int32_t serialId,
        const DataCallInfoWithApnTypes &dataCallInfo) override;
    int32_t DeactivatePdpContext(int32_t slotId, int32_t serialId, const UniInfo &uniInfo) override;
    int32_t GetPdpContextList(int32_t slotId, int32_t serialId, const UniInfo &uniInfo) override;
    int32_t SetInitApnInfo(int32_t slotId, int32_t serialId, const DataProfileDataInfo &dataProfileDataInfo) override;
    int32_t GetLinkBandwidthInfo(int32_t slotId, int32_t serialId, int32_t cid) override;
    int32_t GetLinkCapability(int32_t slotId, int32_t serialId) override;
    int32_t SetLinkBandwidthReportingRule(int32_t slotId, int32_t serialId,
        const DataLinkBandwidthReportingRule &dataLinkBandwidthReportingRule) override;
    int32_t SetDataPermitted(int32_t slotId, int32_t serialId, int32_t dataPermitted) override;
    int32_t SetDataProfileInfo(int32_t slotId, int32_t serialId, const DataProfilesInfo &dataProfilesInfo) override;
    int32_t SendDataPerformanceMode(int32_t slotId, int32_t serialId,
        const DataPerformanceInfo &dataPerformanceInfo) override;
    int32_t SendDataSleepMode(int32_t slotId, int32_t serialId, const DataSleepInfo &dataSleepInfo) override;
    int32_t CleanAllConnections(int32_t slotId, int32_t serialId) override;

    int32_t SetRadioState(int32_t slotId, int32_t serialId, int32_t fun, int32_t rst) override;
    int32_t GetRadioState(int32_t slotId, int32_t serialId) override;
    int32_t GetImei(int32_t slotId, int32_t serialId) override;
    int32_t GetImeiSv(int32_t slotId, int32_t serialId) override;
    int32_t GetMeid(int32_t slotId, int32_t serialId) override;
    int32_t GetVoiceRadioTechnology(int32_t slotId, int32_t serialId) override;
    int32_t GetBasebandVersion(int32_t slotId, int32_t serialId) override;
    int32_t ShutDown(int32_t slotId, int32_t serialId) override;

    int32_t GetSimIO(int32_t slotId, int32_t serialId, const SimIoRequestInfo &simIO) override;
    int32_t GetSimStatus(int32_t slotId, int32_t serialId) override;
    int32_t GetImsi(int32_t slotId, int32_t serialId) override;
    int32_t GetSimLockStatus(int32_t slotId, int32_t serialId, const SimLockInfo &simLockInfo) override;
    int32_t SetSimLock(int32_t slotId, int32_t serialId, const SimLockInfo &simLockInfo) override;
    int32_t ChangeSimPassword(int32_t slotId, int32_t serialId, const SimPasswordInfo &simPassword) override;
    int32_t UnlockPin(int32_t slotId, int32_t serialId, const std::string &pin) override;
    int32_t UnlockPuk(int32_t slotId, int32_t serialId, const std::string &puk, const std::string &pin) override;
    int32_t UnlockPin2(int32_t slotId, int32_t serialId, const std::string &pin2) override;
    int32_t UnlockPuk2(int32_t slotId, int32_t serialId, const std::string &puk2, const std::string &pin2) override;
    int32_t SetActiveSim(int32_t slotId, int32_t serialId, int32_t index, int32_t enable) override;
    int32_t SimStkSendTerminalResponse(int32_t slotId, int32_t serialId, const std::string &strCmd) override;
    int32_t SimStkSendEnvelope(int32_t slotId, int32_t serialId, const std::string &strCmd) override;
    int32_t SimStkSendCallSetupRequestResult(int32_t slotId, int32_t serialId, int32_t accept) override;
    int32_t SimStkIsReady(int32_t slotId, int32_t serialId) override;
    int32_t GetRadioProtocol(int32_t slotId, int32_t serialId) override;
    int32_t SetRadioProtocol(int32_t slotId, int32_t serialId, const RadioProtocol &radioProtocol) override;
    int32_t SimOpenLogicalChannel(int32_t slotId, int32_t serialId, const std::string &appID, int32_t p2) override;
    int32_t SimCloseLogicalChannel(int32_t slotId, int32_t serialId, int32_t channelId) override;
    int32_t SimTransmitApduLogicalChannel(
        int32_t slotId, int32_t serialId, const ApduSimIORequestInfo &apduSimIO) override;
    int32_t SimTransmitApduBasicChannel(
        int32_t slotId, int32_t serialId, const ApduSimIORequestInfo &apduSimIO) override;
    int32_t SimAuthentication(
        int32_t slotId, int32_t serialId, const SimAuthenticationRequestInfo &simAuthInfo) override;
    int32_t UnlockSimLock(int32_t slotId, int32_t serialId, int32_t lockType, const std::string &key) override;
    int32_t SendSimMatchedOperatorInfo(
        int32_t slotId, int32_t serialId, const NcfgOperatorInfo &ncfgOperatorInfo) override;

    // Network
    int32_t GetSignalStrength(int32_t slotId, int32_t serialId) override;
    int32_t GetCsRegStatus(int32_t slotId, int32_t serialId) override;
    int32_t GetPsRegStatus(int32_t slotId, int32_t serialId) override;
    int32_t GetOperatorInfo(int32_t slotId, int32_t serialId) override;
    int32_t GetNetworkSearchInformation(int32_t slotId, int32_t serialId) override;
    int32_t GetNetworkSelectionMode(int32_t slotId, int32_t serialId) override;
    int32_t SetNetworkSelectionMode(
        int32_t slotId, int32_t serialId, const SetNetworkModeInfo &networkModeInfo) override;
    int32_t GetNeighboringCellInfoList(int32_t slotId, int32_t serialId) override;
    int32_t GetCurrentCellInfo(int32_t slotId, int32_t serialId) override;
    int32_t SetPreferredNetwork(int32_t slotId, int32_t serialId, int32_t preferredNetworkType) override;
    int32_t GetPreferredNetwork(int32_t slotId, int32_t serialId) override;
    int32_t GetPhysicalChannelConfig(int32_t slotId, int32_t serialId) override;
    int32_t SetLocateUpdates(int32_t slotId, int32_t serialId, const RilRegNotifyMode mode) override;
    int32_t SetNotificationFilter(int32_t slotId, int32_t serialId, int32_t newFilter) override;
    int32_t SetDeviceState(int32_t slotId, int32_t serialId, int32_t deviceStateType, int32_t deviceStateOn) override;
    int32_t SetNrOptionMode(int32_t slotId, int32_t serialId, int32_t mode) override;
    int32_t GetNrOptionMode(int32_t slotId, int32_t serialId) override;
    int32_t GetRrcConnectionState(int32_t slotId, int32_t serialId) override;
    int32_t GetNrSsbId(int32_t slotId, int32_t serialId) override;

    // Sms
    int32_t SendGsmSms(int32_t slotId, int32_t serialId, const GsmSmsMessageInfo &gsmSmsMessageInfo) override;
    int32_t SendCdmaSms(int32_t slotId, int32_t serialId, const SendCdmaSmsMessageInfo &cdmaSmsMessageInfo) override;
    int32_t AddSimMessage(int32_t slotId, int32_t serialId, const SmsMessageIOInfo &smsMessageIOInfo) override;
    int32_t DelSimMessage(int32_t slotId, int32_t serialId, int32_t index) override;
    int32_t UpdateSimMessage(int32_t slotId, int32_t serialId, const SmsMessageIOInfo &smsMessageIOInfo) override;
    int32_t AddCdmaSimMessage(int32_t slotId, int32_t serialId, const SmsMessageIOInfo &smsMessageIOInfo) override;
    int32_t DelCdmaSimMessage(int32_t slotId, int32_t serialId, int32_t index) override;
    int32_t UpdateCdmaSimMessage(int32_t slotId, int32_t serialId, const SmsMessageIOInfo &smsMessageIOInfo) override;
    int32_t SetSmscAddr(int32_t slotId, int32_t serialId, const ServiceCenterAddress &serviceCenterAddress) override;
    int32_t GetSmscAddr(int32_t slotId, int32_t serialId) override;
    int32_t SetCBConfig(int32_t slotId, int32_t serialId, const CBConfigInfo &cellBroadcastInfo) override;
    int32_t GetCBConfig(int32_t slotId, int32_t serialId) override;
    int32_t SetCdmaCBConfig(
        int32_t slotId, int32_t serialId, const CdmaCBConfigInfoList &cdmaCBConfigInfoList) override;
    int32_t GetCdmaCBConfig(int32_t slotId, int32_t serialId) override;
    int32_t SendSmsMoreMode(int32_t slotId, int32_t serialId, const GsmSmsMessageInfo &gsmSmsMessageInfo) override;
    int32_t SendSmsAck(int32_t slotId, int32_t serialId, const ModeData &modeData) override;

    int32_t SendRilAck() override;

    int32_t SetCallback(const sptr<V1_1::IRilCallback> &rilCallback) override;
    int32_t SetCallback1_2(const sptr<V1_2::IRilCallback> &rilCallback) override;
    int32_t SetCallback1_3(const sptr<V1_3::IRilCallback> &rilCallback) override;
    int32_t Init();
    class RilDeathRecipient : public IRemoteObject::DeathRecipient {
    public:
        explicit RilDeathRecipient(const wptr<RilImpl> &rilInterfaceImpl) : rilInterfaceImpl_(rilInterfaceImpl) {}
        virtual ~RilDeathRecipient() = default;
        virtual void OnRemoteDied(const wptr<IRemoteObject> &object) override;

    private:
        wptr<RilImpl> rilInterfaceImpl_;
    };

    template<typename FuncType, typename... ParamTypes>
    inline int32_t TaskSchedule(FuncType &&_func, int32_t slotId, ParamTypes &&... _args) const
    {
        if (_func == nullptr) {
            HDF_LOGE("manager or func is null pointer");
            return RIL_ERR_NULL_POINT;
        }
        if (slotId >= Telephony::HRilManager::GetInstance().GetMaxSimSlotCount()) {
            HDF_LOGE("slotId is inValid");
            return RIL_ERR_INVALID_PARAMETER;
        }
        auto ret = (Telephony::HRilManager::GetInstance().*(_func))(slotId, std::forward<ParamTypes>(_args)...);
        return ret;
    }

private:
    int32_t UnRegister();
    int32_t AddRilDeathRecipient(const sptr<IRilCallback> &callback);
    int32_t RemoveRilDeathRecipient(const sptr<IRilCallback> &callback);
};
} // namespace V1_3
} // namespace Ril
} // namespace HDI
} // namespace OHOS
#endif // OHOS_HDI_RIL_V1_0_RILIMPL_H