/*
 * Copyright (c) 2024-2026 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 FOUNDATION_ACE_INTERFACE_UI_SESSION_MANAGER_H
#define FOUNDATION_ACE_INTERFACE_UI_SESSION_MANAGER_H
#include <atomic>
#include <cstdint>
#include <functional>
#include <map>
#include <memory>
#include <mutex>
#include <set>
#include <shared_mutex>
#include <unordered_map>
#include <vector>

#include "base/utils/macros.h"

#include "param_config.h"
#include "ui_content_errors.h"
#include "ui_content_proxy_error_code.h"
#include "ui_translate_type.h"
#include "ui_translate_manager.h"

namespace OHOS {
class IRemoteObject;
template<typename T>
class sptr;
namespace Media {
class PixelMap;
} // namespace Media
} // namespace OHOS
namespace OHOS::Ace {
class InspectorJsonValue;
class ACE_FORCE_EXPORT UiSessionManager {
public:
    using InspectorFunction = std::function<void(bool onlyNeedVisible, ParamConfig config)>;
    using NotifyAllWebFunction = std::function<void(bool isRegister)>;
    using GetPixelMapFunction = std::function<void()>;
    using NotifySendCommandFunction = std::function<void(int32_t id, const std::string& command)>;
    using NotifySendCommandAsyncFunction = std::function<int32_t(int32_t id, const std::string& command)>;
    using SendCommandFunction = std::function<void(int32_t value)>;
    using RelaxedCommandFunction = std::function<void(const std::string& command)>;
    using ExeAppAIFunctionFunction = std::function<std::pair<uint32_t, std::string>(
        const std::string&, const std::string&, const sptr<IRemoteObject>&, int32_t)>;
    using GetHitTestInfoFunction = std::function<void(InteractionParamConfig config)>;
    using GetStateMgmtInfoFunction = std::function<void(const std::string& componentName,
        const std::string& propertyName, const std::string& jsonPath, bool onlyVisible)>;
    using GetImagesByIdFunction =
        std::function<void(const std::vector<int32_t>&, const std::map<int32_t, std::vector<int32_t>>&)>;

    using GetWebInfoByRequestFunction = std::function<void(int32_t, const std::string&)>;
    using GetAbilityLanguageInfoFunction = std::function<int32_t(std::string&, std::string&)>;
    using PageTranslateTextFunction = std::function<void(bool)>;
    using PageTranslateEndFunction = std::function<void()>;
    using PageTranslateResetFunction = std::function<void(int32_t)>;
    using PageTranslateResultFunction = std::function<void(const std::vector<TranslateResult>&)>;
    using PageSceneDetectFunction = std::function<void(int32_t, const std::string&, bool)>;

    enum class WebPageSceneOp {
        RegisterRules,    // Register rules + traverse for reportOnRegister
        UnregisterRules,  // Unregister rules
        Traverse,         // Traverse web components (GetPageScene)
    };
    using WebPageSceneFunction = std::function<void(WebPageSceneOp op, int32_t processId, const std::string& ruleJson,
        bool isGetResult)>;
    /**
     * @description: Get ui_manager instance,this object process singleton
     * @return The return value is ui_manager singleton
     */
    static UiSessionManager* GetInstance();

    /**
     * @description: execute click callback when component click event occurs
     */
    virtual void ReportClickEvent(const std::string& data) {};

    /**
     * @description: execute search callback when component search event occurs
     */
    virtual void ReportSearchEvent(const std::string& data) {};

    /**
     * @description: execute text change callback when component text change event occurs
     */
    virtual void ReportTextChangeEvent(const std::string& data) {};

    /**
     * @description: execute switch callback when page switch to another page occurs
     */
    virtual void ReportRouterChangeEvent(const std::string& data) {};

    /**
     * @description: execute click callback when page some component change occurs
     */
    virtual void ReportComponentChangeEvent(const std::string& key, const std::string& value, uint32_t eventType) {};

    /**
     * @description: execute click callback when page some component change occurs
     */
    virtual void ReportComponentChangeEvent(int32_t nodeId, const std::string& key,
        const std::string& value, uint32_t eventType) {};

    /**
     * @description: execute callback when scroll event occurs
     */
    virtual void ReportScrollEvent(const std::string& data) {};

    /**
     * @description: execute callback when life cycle event occurs
     */
    virtual void ReportLifeCycleEvent(const std::string& data) {};

    /**
     * @description: execute callback when select text event occurs
     */
    virtual void ReportSelectTextEvent(const std::string& data) {};

    /**
     * @description: get current page inspector tree value
     */
    virtual void GetInspectorTree(ParamConfig config = ParamConfig()) {};
    virtual void AddValueForTree(int32_t id, const std::string& value) {};
    virtual void WebTaskNumsChange(int32_t num) {};
    virtual void ReportInspectorTreeValue(const std::string& value) {};
    virtual void SaveForSendCommandFunction(NotifySendCommandFunction&& function) {};
    virtual void SaveForSendCommandAsyncFunction(NotifySendCommandAsyncFunction&& function) {};
    virtual void SaveInspectorTreeFunction(InspectorFunction&& function) {};
    virtual void SaveRegisterForWebFunction(NotifyAllWebFunction&& function) {};
    virtual void SaveGetHitTestInfoCallback(GetHitTestInfoFunction&& function) {};
    virtual void GetLatestHitTestNodeInfosForTouch(InteractionParamConfig config) {};
    virtual void ReportHitTestNodeInfos(const std::string& data) {};
    /**
     * @description: Report web editing area focus/blur/textChange event
     * @param type The type of event (focus, blur, or textChange), defaults to empty string
     */
    virtual void ReportWebInputEvent(
        int64_t accessibilityId, const std::string& data, const std::string& type = "") {};
    virtual void NotifyAllWebPattern(bool isRegister) {};
    virtual void NotifySendCommandPattern(int32_t id, const std::string& command) {};
    virtual int32_t NotifySendCommandAsyncPattern(int32_t id, const std::string& command) { return 11; };
    virtual void SetClickEventRegistered(bool status) {};
    virtual void SetSearchEventRegistered(bool status) {};
    virtual void SetTextChangeEventRegistered(bool status) {};
    virtual void OnRouterChange(const std::string& path, const std::string& event) {};
    virtual void SetRouterChangeEventRegistered(bool status) {};
    virtual void SetComponentChangeEventRegistered(bool status) {};
    virtual void SetComponentChangeEventMask(uint32_t mask) {};
    virtual void SetScrollEventRegistered(bool status) {};
    virtual void SetLifeCycleEventRegistered(bool status) {};
    virtual void SetSelectTextEventRegistered(bool status) {};
    virtual bool GetClickEventRegistered()
    {
        return false;
    };
    virtual bool GetSearchEventRegistered()
    {
        return false;
    };
    virtual bool GetTextChangeEventRegistered()
    {
        return false;
    };
    virtual bool GetRouterChangeEventRegistered()
    {
        return false;
    };
    virtual bool GetComponentChangeEventRegistered()
    {
        return false;
    };
    virtual bool NeedComponentChangeTypeReporting(uint32_t eventType)
    {
        return false;
    };
    virtual bool GetWebFocusRegistered()
    {
        return false;
    };
    virtual bool GetScrollEventRegistered()
    {
        return false;
    };
    virtual bool GetLifeCycleEventRegistered()
    {
        return false;
    };
    virtual bool GetSelectTextEventRegistered()
    {
        return false;
    };
    virtual void SaveBaseInfo(const std::string& info) {};
    virtual void SendBaseInfo(int32_t processId) {};
    virtual void SaveGetPixelMapFunction(GetPixelMapFunction&& function) {};
    virtual void SaveGetImagesByIdFunction(GetImagesByIdFunction&& function) {};
    virtual void SaveTranslateManager(std::shared_ptr<UiTranslateManager> uiTranslateManager,
        int32_t instanceId) {};
    virtual void SaveGetCurrentInstanceIdCallback(std::function<int32_t()>&& callback) {};
    virtual void RemoveSaveGetCurrentInstanceId(int32_t instanceId) {};
    virtual void SaveArkUIPageTranslateFunctions(PageTranslateTextFunction&& getTextFunction,
        PageTranslateTextFunction&& startFunction, PageTranslateEndFunction&& endFunction,
        PageTranslateResetFunction&& resetFunction, PageTranslateResultFunction&& resultFunction) {};
    virtual std::shared_ptr<UiTranslateManager> GetCurrentTranslateManager() {
        std::shared_ptr<UiTranslateManager> currentTranslateManager = nullptr;
        return currentTranslateManager;
    };
    virtual void GetWebViewLanguage() {};
    virtual void RegisterPipeLineGetCurrentPageName(std::function<std::string()>&& callback) {};
    virtual void GetCurrentPageName() {};
    virtual void SendCurrentPageName(const std::string& result) {};
    virtual void SendCurrentLanguage(std::string result) {};
    virtual void SaveProcessId(std::string key, int32_t id) {};
    virtual void EraseProcessId(const std::string& key, int32_t targetPid) {};
    virtual void MarkPageTranslateOwner(int32_t processId) {};
    virtual void OnPageTranslateResultHandled(int32_t processId) {};
    virtual void GetWebTranslateText(std::string extraData, bool isContinued) {};
    virtual int32_t GetPageTranslateText(const std::string& request)
    {
        return FAILED;
    };
    virtual int32_t StartPageTranslate(const std::string& request)
    {
        return FAILED;
    };
    virtual void EndPageTranslate() {};
    virtual void ResetPageTranslate(int32_t nodeId = -1) {};
    virtual void SendPageTranslateResult(const std::string& result) {};
    virtual void SendPageTextToAI(int32_t nodeId, const std::string& text, int64_t version) {};
    virtual int32_t GetCurrentAbilityLanguageInfo(std::string& language, std::string& region)
    {
        return FAILED;
    };
    virtual void SaveGetCurrentAbilityLanguageInfoFunction(GetAbilityLanguageInfoFunction&& callback) {};
    virtual void GetStateMgmtInfo(const std::string& componentName, const std::string& propertyName,
        const std::string& jsonPath, bool onlyVisible = false) {};
    virtual void SendWebTextToAI(int32_t nodeId, std::string res) {};
    virtual void SendTranslateResult(int32_t nodeId, std::vector<std::string> results, std::vector<int32_t> ids) {};
    virtual void SendTranslateResult(int32_t nodeId, std::string result) {};
    virtual void ResetTranslate(int32_t nodeId = -1) {};
    virtual void GetPixelMap() {};
    virtual void GetMultiImagesById(const std::vector<int32_t>& arkUIIds,
        const std::map<int32_t, std::vector<int32_t>>& arkWebs) {};
    virtual void SendCommand(const std::string& command) {};
    virtual void SaveSendCommandFunction(SendCommandFunction&& function) {};
    virtual void SaveRelaxedCommandFunction(RelaxedCommandFunction&& function) {};
    virtual void SaveGetStateMgmtInfoFunction(GetStateMgmtInfoFunction&& callback) {};

    virtual void SaveGetWebInfoByRequestFunction(GetWebInfoByRequestFunction&& callback) {};
    virtual void GetWebInfoByRequest(int32_t webId, const std::string& request) {};
    virtual void SendWebInfoByRequest(uint32_t windowId, int32_t webId, const std::string& request,
        const std::string& result, WebRequestErrorCode errorCode) {};
    virtual void SendPixelMap(const std::vector<std::pair<int32_t, std::shared_ptr<Media::PixelMap>>>& maps) {};
    virtual void SendArkUIImagesById(int32_t windowId,
        const std::unordered_map<int32_t, std::shared_ptr<Media::PixelMap>>& componentImages,
        MultiImageQueryErrorCode arkUIErrorCode) {};
    virtual void SendArkWebImagesById(int32_t windowId, const std::map<int32_t, std::map<int32_t,
        std::shared_ptr<Media::PixelMap>>>& webImages, MultiImageQueryErrorCode arkWebErrorCode) {};
    virtual void GetVisibleInspectorTree(ParamConfig config = ParamConfig()) {};
    virtual void RegisterPipeLineExeAppAIFunction(ExeAppAIFunctionFunction&& callback) {};
    virtual void ExeAppAIFunction(const std::string& funcName, const std::string& params,
        const sptr<IRemoteObject>& remoteObj, int32_t nodeId = -1) {};
    virtual void SendExeAppAIFunctionResult(uint32_t result, const std::string& data) {};
    virtual void GetSpecifiedContentOffsets(int32_t id, const std::string& content) {};
    virtual void HighlightSpecifiedContent(
        int32_t id, const std::string& content, const std::vector<std::string>& nodeIds, const std::string& configs) {};
    virtual void ReportSelectText() {};
    virtual void SaveGetSpecifiedContentOffsetsFunction(
        std::function<std::vector<std::pair<float, float>>(int32_t id, const std::string& content)>&& callback) {};
    virtual void SaveHighlightSpecifiedContentFunction(std::function<void(int32_t id, const std::string& content,
        const std::vector<std::string>& nodeIds, const std::string& configs)>&& callback) {};
    virtual void SaveSelectTextFunction(std::function<void()>&& callback) {};
    virtual void SendSpecifiedContentOffsets(const std::vector<std::pair<float, float>>& offsets) {};
    virtual void RegisterContentChangeCallback(const ContentChangeConfig& config) {};
    virtual void UnregisterContentChangeCallback() {};
    virtual void ReportContentChangeEvent(ChangeType type, const std::string& simpleTree) {};
    virtual void SetStartContentChangeDetectCallback(std::function<void(ContentChangeConfig)>&&) {};
    virtual void SetStopContentChangeDetectCallback(std::function<void()>&&) {};
    virtual void ReportGetStateMgmtInfo(std::vector<std::string> results) {};
    virtual int32_t RegisterPageSceneRules(int32_t processId, const std::string& ruleJson)
    {
        return NOT_CONNECTED;
    };
    virtual int32_t UnregisterPageSceneRules(int32_t processId, const std::string& ruleSetId)
    {
        return NOT_CONNECTED;
    };
    virtual int32_t GetPageScene(int32_t processId, const std::string& ruleJsonOrRuleSetId)
    {
        return NOT_CONNECTED;
    };
    virtual bool GetPageSceneRulesRegistered()
    {
        return false;
    };
    virtual void ReportPageSceneEvent(int32_t processId, const std::string& sceneJson, bool isGetResult) {};
    virtual void CompleteGetPageScene(int32_t processId) {};
    virtual void NotifyPageSceneNodeChanged(const std::string& nodeTag, bool isAttach) {};
    virtual void NotifyPageSceneContentChanged() {};
    virtual void FlushPageSceneNodeChanged() {};
    virtual void SavePageSceneDetectFunction(PageSceneDetectFunction&& function) {};
    virtual void SaveWebPageSceneFunction(WebPageSceneFunction&& function) {};

protected:
    UiSessionManager() = default;
    virtual ~UiSessionManager() = default;

    std::map<std::string, std::set<int32_t>> processMap_;
    std::shared_mutex processMapMutex_;
    std::atomic<int32_t> clickEventRegisterProcesses_ = 0;
    std::atomic<int32_t> searchEventRegisterProcesses_ = 0;
    std::atomic<int32_t> textChangeEventRegisterProcesses_ = 0;
    std::atomic<int32_t> routerChangeEventRegisterProcesses_ = 0;
    std::atomic<int32_t> componentChangeEventRegisterProcesses_ = 0;
    uint32_t componentChangeEventMask_ = 0;
    std::atomic<int32_t> scrollEventRegisterProcesses_ = 0;
    std::atomic<int32_t> lifeCycleEventRegisterProcesses_ = 0;
    std::atomic<int32_t> selectTextEventRegisterProcesses_ = 0;
    std::atomic<int32_t> pageSceneRuleRegisterProcesses_ = 0;
    bool webFocusEventRegistered = false;
    std::mutex webFocusEventRegisteredMutex_;
    InspectorFunction inspectorFunction_ = 0;
    std::mutex inspectorFunctionMutex_;
    NotifyAllWebFunction notifyWebFunction_ = 0;
    std::mutex notifyWebFunctionMutex_;
    GetPixelMapFunction getPixelMapFunction_ = 0;
    std::mutex getPixelMapFunctionMutex_;
    GetHitTestInfoFunction getHitTestInfoFunction_ = 0;
    std::mutex getHitTestInfoFunctionMutex_;
    GetImagesByIdFunction getImagesByIdFunction_ = 0;
    std::mutex getImagesByIdFunctionMutex_;
    NotifySendCommandFunction notifySendCommandFunction_ = 0;
    std::mutex notifySendCommandFunctionMutex_;
    NotifySendCommandAsyncFunction notifySendCommandAsyncFunction_ = 0;
    std::mutex notifySendCommandAsyncFunctionMutex_;
    GetStateMgmtInfoFunction getStateMgmtInfoFunction_ = 0;
    std::mutex getStateMgmtInfoFunctionMutex_;
    std::shared_ptr<InspectorJsonValue> jsonValue_ = nullptr;
    std::mutex jsonValueMutex_;
    std::atomic<int32_t> webTaskNums_ = 0;
    std::string baseInfo_;
    std::mutex baseInfoMutex_;
    std::map<int32_t, std::shared_ptr<UiTranslateManager>> translateManagerMap_;
    std::shared_mutex translateManagerMutex_;
    std::function<int32_t()> getInstanceIdCallback_;
    std::shared_mutex getInstanceIdCallbackMutex_;
    std::function<std::string()> pipelineContextPageNameCallback_;
    std::mutex pipelineContextPageNameCallbackMutex_;
    std::function<std::vector<std::pair<float, float>>(int32_t id,
        const std::string& content)> getSpecifiedContentOffsetsCallback_;
    std::mutex getSpecifiedContentOffsetsCallbackMutex_;
    std::function<void(
        int32_t id, const std::string& content, const std::vector<std::string>& nodeIds, const std::string& configs)>
        highlightSpecifiedContentCallback_;
    std::mutex highlightSpecifiedContentCallbackMutex_;
    std::function<void()> selectTextCallback_;
    std::mutex selectTextCallbackMutex_;
    SendCommandFunction sendCommandFunction_ = 0;
    std::mutex sendCommandFunctionMutex_;
    ExeAppAIFunctionFunction pipelineExeAppAIFunctionCallback_;
    std::mutex pipelineExeAppAIFunctionCallbackMutex_;
    std::function<void(ContentChangeConfig)> startContentChangeDetectCallback_;
    std::mutex startContentChangeDetectCallbackMutex_;
    std::function<void()> stopContentChangeDetectCallback_;
    std::mutex stopContentChangeDetectCallbackMutex_;
    GetWebInfoByRequestFunction getWebInfoByRequestCallback_;
    std::mutex getWebInfoByRequestCallbackMutex_;
    GetAbilityLanguageInfoFunction getAbilityLanguageInfoCallback_;
    std::mutex getAbilityLanguageInfoCallbackMutex_;
    PageTranslateTextFunction getArkUIPageTranslateTextFunction_;
    PageTranslateTextFunction startArkUIPageTranslateFunction_;
    PageTranslateEndFunction endArkUIPageTranslateFunction_;
    PageTranslateResetFunction resetArkUIPageTranslateFunction_;
    PageTranslateResultFunction sendArkUIPageTranslateResultFunction_;
    std::mutex arkUIPageTranslateFunctionMutex_;
    RelaxedCommandFunction relaxedCommandFunction_ = nullptr;
    PageSceneDetectFunction pageSceneDetectFunction_;
    std::mutex pageSceneDetectFunctionMutex_;
    WebPageSceneFunction webPageSceneFunction_;
    std::mutex webPageSceneMutex_;
};
} // namespace OHOS::Ace
#endif // FOUNDATION_ACE_INTERFACE_UI_SESSION_MANAGER_H