package handler

import (
	"github.com/gin-gonic/gin"
	"github.com/gotunnel/internal/server/db"
	// removed router import
	"github.com/gotunnel/internal/server/router/dto"
)

// JSPluginHandler JS 插件处理器
type JSPluginHandler struct {
	app AppInterface
}

// NewJSPluginHandler 创建 JS 插件处理器
func NewJSPluginHandler(app AppInterface) *JSPluginHandler {
	return &JSPluginHandler{app: app}
}

// List 获取 JS 插件列表
// @Summary 获取所有 JS 插件
// @Description 返回所有注册的 JS 插件
// @Tags JS插件
// @Produce json
// @Security Bearer
// @Success 200 {object} Response{data=[]db.JSPlugin}
// @Router /api/js-plugins [get]
func (h *JSPluginHandler) List(c *gin.Context) {
	plugins, err := h.app.GetJSPluginStore().GetAllJSPlugins()
	if err != nil {
		InternalError(c, err.Error())
		return
	}
	if plugins == nil {
		plugins = []db.JSPlugin{}
	}
	Success(c, plugins)
}

// Create 创建 JS 插件
// @Summary 创建 JS 插件
// @Description 创建新的 JS 插件
// @Tags JS插件
// @Accept json
// @Produce json
// @Security Bearer
// @Param request body dto.JSPluginCreateRequest true "插件信息"
// @Success 200 {object} Response
// @Failure 400 {object} Response
// @Router /api/js-plugins [post]
func (h *JSPluginHandler) Create(c *gin.Context) {
	var req dto.JSPluginCreateRequest
	if !BindJSON(c, &req) {
		return
	}

	plugin := &db.JSPlugin{
		Name:        req.Name,
		Source:      req.Source,
		Signature:   req.Signature,
		Description: req.Description,
		Author:      req.Author,
		Config:      req.Config,
		AutoStart:   req.AutoStart,
		Enabled:     true,
	}

	if err := h.app.GetJSPluginStore().SaveJSPlugin(plugin); err != nil {
		InternalError(c, err.Error())
		return
	}

	Success(c, gin.H{"status": "ok"})
}

// Get 获取单个 JS 插件
// @Summary 获取 JS 插件详情
// @Description 获取指定 JS 插件的详细信息
// @Tags JS插件
// @Produce json
// @Security Bearer
// @Param name path string true "插件名称"
// @Success 200 {object} Response{data=db.JSPlugin}
// @Failure 404 {object} Response
// @Router /api/js-plugin/{name} [get]
func (h *JSPluginHandler) Get(c *gin.Context) {
	name := c.Param("name")

	plugin, err := h.app.GetJSPluginStore().GetJSPlugin(name)
	if err != nil {
		NotFound(c, "plugin not found")
		return
	}

	Success(c, plugin)
}

// Update 更新 JS 插件
// @Summary 更新 JS 插件
// @Description 更新指定 JS 插件的信息
// @Tags JS插件
// @Accept json
// @Produce json
// @Security Bearer
// @Param name path string true "插件名称"
// @Param request body dto.JSPluginUpdateRequest true "更新内容"
// @Success 200 {object} Response
// @Failure 400 {object} Response
// @Router /api/js-plugin/{name} [put]
func (h *JSPluginHandler) Update(c *gin.Context) {
	name := c.Param("name")

	var req dto.JSPluginUpdateRequest
	if !BindJSON(c, &req) {
		return
	}

	plugin := &db.JSPlugin{
		Name:        name,
		Source:      req.Source,
		Signature:   req.Signature,
		Description: req.Description,
		Author:      req.Author,
		Config:      req.Config,
		AutoStart:   req.AutoStart,
		Enabled:     req.Enabled,
	}

	if err := h.app.GetJSPluginStore().SaveJSPlugin(plugin); err != nil {
		InternalError(c, err.Error())
		return
	}

	Success(c, gin.H{"status": "ok"})
}

// Delete 删除 JS 插件
// @Summary 删除 JS 插件
// @Description 删除指定的 JS 插件
// @Tags JS插件
// @Produce json
// @Security Bearer
// @Param name path string true "插件名称"
// @Success 200 {object} Response
// @Router /api/js-plugin/{name} [delete]
func (h *JSPluginHandler) Delete(c *gin.Context) {
	name := c.Param("name")

	if err := h.app.GetJSPluginStore().DeleteJSPlugin(name); err != nil {
		InternalError(c, err.Error())
		return
	}

	Success(c, gin.H{"status": "ok"})
}

// PushToClient 推送 JS 插件到客户端
// @Summary 推送插件到客户端
// @Description 将 JS 插件推送到指定客户端
// @Tags JS插件
// @Accept json
// @Produce json
// @Security Bearer
// @Param name path string true "插件名称"
// @Param clientID path string true "客户端ID"
// @Param request body dto.JSPluginPushRequest false "推送配置"
// @Success 200 {object} Response
// @Failure 400 {object} Response
// @Failure 404 {object} Response
// @Router /api/js-plugin/{name}/push/{clientID} [post]
func (h *JSPluginHandler) PushToClient(c *gin.Context) {
	pluginName := c.Param("name")
	clientID := c.Param("clientID")

	// 解析请求体（可选）
	var pushReq dto.JSPluginPushRequest
	c.ShouldBindJSON(&pushReq) // 忽略错误，允许空请求体

	// 检查客户端是否在线
	if !h.app.GetServer().IsClientOnline(clientID) {
		ClientNotOnline(c)
		return
	}

	// 获取插件
	plugin, err := h.app.GetJSPluginStore().GetJSPlugin(pluginName)
	if err != nil {
		NotFound(c, "plugin not found")
		return
	}

	if !plugin.Enabled {
		Error(c, 400, CodePluginDisabled, "plugin is disabled")
		return
	}

	// 推送到客户端
	req := JSPluginInstallRequest{
		PluginName: plugin.Name,
		Source:     plugin.Source,
		Signature:  plugin.Signature,
		RuleName:   plugin.Name,
		RemotePort: pushReq.RemotePort,
		Config:     plugin.Config,
		AutoStart:  plugin.AutoStart,
	}

	if err := h.app.GetServer().InstallJSPluginToClient(clientID, req); err != nil {
		InternalError(c, err.Error())
		return
	}

	Success(c, gin.H{
		"status":      "ok",
		"plugin":      pluginName,
		"client":      clientID,
		"remote_port": pushReq.RemotePort,
	})
}
