#pragma once

#include <stdint.h>
#include <functional>
#include <string>
#include <memory>
#include <vector>
#include "AccountDevice.h"

namespace rtx
{
    namespace pcsdk
    {
        // 错误码
        enum RtcxPcCode {
            RTCX_PC_SUCCESS = 0,
            RTCX_PC_FAIL = -1
        };
        // 初始化参数
        struct InitParam
        {
            std::string cfgFileName = "config.ini"; // 配置文件名
            std::string appKey;
            std::string appSecret;
        };
        // 拉流失败原因
        enum class PlayFailReason : int32_t
        {
            SIGNAL_ERROR = 0,   // 信令请求失败（设备/网关返回非成功状态），errCode 为信令返回的业务错误码
            SIGNAL_TIMEOUT = 1, // 信令请求超时（20 秒内未收到设备响应），errCode 无实际意义
            PLAYER_ERROR = 2    // 播放器/流媒体内部错误，errCode 为播放器错误码
        };

        struct PlayTimelineStep
        {
            std::string label;
            int64_t elapsedMs = 0;
            int64_t stepMs = 0;
        };

        struct PlayTimelineInfo
        {
            std::string playMode;
            std::string streamType;
            std::vector<PlayTimelineStep> steps;
            bool valid = false;
        };

        struct LanDiscoveredDevice
        {
            std::string ip;
            int32_t sigPort = 9821;
            std::string protocol = "TCP";
            std::string productKey;
            std::string deviceName;
            bool isGateway = false;

            std::string iotId() const { return productKey + deviceName; }
        };

        struct LanDiscoverParam
        {
            std::string targetIp; // 空=广播；非空=单播指定 IPv4
        };

        // 事件回调接口
        class IRtcxPcEvtHandler
        {
        public:
            typedef std::shared_ptr<IRtcxPcEvtHandler> Ptr;

            IRtcxPcEvtHandler() {}

            virtual ~IRtcxPcEvtHandler() {}

            // 拉流开始加载（信令交互完成，播放器开始建立连接）
            virtual void OnPlayLoading(const std::string &deviceName) {}

            // 拉流成功，已开始播放
            virtual void OnPlayStarted(const std::string &deviceName) {}

            // 拉流失败且即将自动重连（attempt 从 1 开始，maxAttempts 一般为 3）
            virtual void OnPlayRetrying(const std::string &deviceName, int32_t attempt, int32_t maxAttempts) {}

            // 拉流失败（重试耗尽或不可重试错误）
            virtual void OnPlayError(const std::string &deviceName, PlayFailReason reason, int32_t errCode) {}

            // 截图完成（errCode 为 PLAYERCODE_SUCCESS 表示成功）
            virtual void OnSnapshotTaken(const std::string &deviceName, int32_t errCode, const std::string &filePath) {}

            // 局域网发现：每发现一台新设备
            virtual void OnLanDeviceDiscovered(const LanDiscoveredDevice &device) {}

            // 局域网发现：搜索结束（可能为空列表）
            virtual void OnLanDiscoverFinished(const std::vector<LanDiscoveredDevice> &devices) {}
        };

        // 接口
        class IRtcxPcApi
        {
        public:
            typedef std::shared_ptr<IRtcxPcApi> Ptr;

            IRtcxPcApi() {}

            virtual ~IRtcxPcApi() {}

            // 初始化
            static int32_t Initialize(const InitParam &param);
            // 反初始化
            static int32_t Uninitialize();
            // 获取版本号
            static int32_t GetVersion(std::string &version);

            // 创建PC API智能指针
            static IRtcxPcApi::Ptr CreateRtcxPcApi(const std::shared_ptr<IRtcxPcEvtHandler> handler);

            // 登入；失败时可通过 errorMessage 获取接口返回的错误描述
            virtual int32_t Login(const std::string &userName, const std::string &password, std::string *errorMessage = nullptr) = 0;

            virtual int32_t LoginLan() = 0;

            virtual void SetLanDeviceEndpoint(const std::string &iotId, const std::string &ip, int32_t sigPort,
                                              const std::string &protocol, const std::string &productKey,
                                              const std::string &deviceName) = 0;

            virtual bool IsLanMode() const = 0;

            // 局域网设备发现；targetIp 为空广播，非空单播指定 IPv4
            virtual int32_t StartLanDiscover(const LanDiscoverParam &param = {}) = 0;
            virtual void StopLanDiscover() = 0;
            virtual bool IsLanDiscovering() const = 0;

            // 登出
            virtual int32_t Logout() = 0;

            // 获取设备列表
            virtual std::shared_ptr<rtx::account::DeviceList> GetDeviceList(const rtx::account::DeviceListReq &deviceListReq) = 0;

            // 获取网关子设备列表
            virtual std::shared_ptr<rtx::account::GatewaySubDeviceList> GetGatewaySubDeviceList(const rtx::account::GatewaySubDeviceListReq &req) = 0;

            // 获取设备分组列表
            virtual std::shared_ptr<rtx::account::DeviceGroupList> GetDeviceGroupList(const rtx::account::DeviceGroupListReq &deviceGroupListReq) = 0;

            // 开始播放；子设备拉流可传父网关 iotId 作为 dstUserId，普通设备保持默认
            virtual void StartPlay(const std::string &deviceName, const std::string &productKey, void *hWnd, const std::string &dstUserId = "") = 0;

            // 结束播放
            virtual void StopPlay() = 0;

            // 截图（异步）；filePath 为本地保存路径；结果通过 OnSnapshotTaken 回调
            virtual int32_t Snapshot(const std::string &filePath, bool withWatermark = false) = 0;

            // 获取当前播放 Timeline（出图前 valid=false）
            virtual PlayTimelineInfo GetPlayTimeline() const = 0;

            // 获取当前码流类型描述
            virtual std::string GetPlayStreamType() const = 0;
        };

    }
}
