// Package remote 提供远程设备控制相关功能的控制器
// 实现平台向中继设备发送指令等操作
package remote

import (
	"git.huangwc.com/pig/pig-farm-controller/internal/controller"
	"git.huangwc.com/pig/pig-farm-controller/internal/logs"
	"git.huangwc.com/pig/pig-farm-controller/internal/service"
	"github.com/gin-gonic/gin"
)

// Controller 远程控制控制器
type Controller struct {
	websocketService *service.WebSocketService
	logger           *logs.Logger
}

// NewController 创建远程控制控制器实例
func NewController(websocketService *service.WebSocketService) *Controller {
	return &Controller{
		websocketService: websocketService,
		logger:           logs.NewLogger(),
	}
}

// SendCommandRequest 发送指令请求结构体
type SendCommandRequest struct {
	DeviceID string      `json:"device_id" binding:"required"`
	Command  string      `json:"command" binding:"required"`
	Data     interface{} `json:"data,omitempty"`
}

// SendCommandResponseData 发送指令响应数据结构体
type SendCommandResponseData struct {
	DeviceID string `json:"device_id"`
	Command  string `json:"command"`
	Status   string `json:"status"`
}

// SendCommand 向设备发送指令接口
// @Summary 向设备发送指令
// @Description 平台向指定设备发送控制指令
// @Tags remote
// @Accept json
// @Produce json
// @Param request body SendCommandRequest true "指令请求"
// @Success 200 {object} controller.APIResponse{data=SendCommandResponseData}
// @Router /api/v1/remote/command [post]
func (c *Controller) SendCommand(ctx *gin.Context) {
	var req SendCommandRequest
	if err := ctx.ShouldBindJSON(&req); err != nil {
		controller.SendErrorResponse(ctx, controller.InvalidParameterCode, "请求参数错误")
		return
	}

	// 通过WebSocket服务向设备发送指令
	err := c.websocketService.SendCommand(req.DeviceID, req.Command, req.Data)
	if err != nil {
		c.logger.Error("发送指令失败: " + err.Error())
		controller.SendErrorResponse(ctx, controller.InternalServerErrorCode, "发送指令失败: "+err.Error())
		return
	}

	data := SendCommandResponseData{
		DeviceID: req.DeviceID,
		Command:  req.Command,
		Status:   "sent",
	}

	controller.SendSuccessResponse(ctx, "指令发送成功", data)
}

// ListConnectedDevicesResponseData 获取已连接设备列表响应数据结构体
type ListConnectedDevicesResponseData struct {
	Devices []string `json:"devices"`
}

// ListConnectedDevices 获取已连接设备列表接口
// @Summary 获取已连接设备列表
// @Description 获取当前通过WebSocket连接到平台的设备列表
// @Tags remote
// @Produce json
// @Success 200 {object} controller.APIResponse{data=ListConnectedDevicesResponseData}
// @Router /api/v1/remote/devices [get]
func (c *Controller) ListConnectedDevices(ctx *gin.Context) {
	// 获取已连接的设备列表
	devices := c.websocketService.GetConnectedDevices()

	data := ListConnectedDevicesResponseData{
		Devices: devices,
	}

	controller.SendSuccessResponse(ctx, "获取设备列表成功", data)
}
