package api

import (
	"encoding/json"
	"gitee.ltd/lxh/logger/log"
	"github.com/gin-gonic/gin"
	"wireguard-dashboard/http/param"
	"wireguard-dashboard/model/entity"
	"wireguard-dashboard/queues"
	"wireguard-dashboard/repository"
	"wireguard-dashboard/utils"
)

type setting struct{}

func Setting() setting {
	return setting{}
}

// SetSetting
// @description: 添加/更改设置
// @receiver setting
// @param c
func (setting) SetSetting(c *gin.Context) {
	var p param.SetSetting
	if err := c.ShouldBind(&p); err != nil {
		utils.GinResponse(c).FailedWithErr("参数错误", err)
		return
	}

	if err := repository.System().Save(&entity.Setting{
		Code:     p.Code,
		Data:     p.Data,
		Describe: p.Describe,
	}); err != nil {
		utils.GinResponse(c).FailedWithErr("操作失败", err)
		return
	}

	utils.GinResponse(c).OK()
}

// SetServerGlobal
// @description: 设置服务端的全局设定
// @receiver setting
// @param c
func (setting) SetServerGlobal(c *gin.Context) {
	var p param.SetServerGlobal
	if err := c.ShouldBind(&p); err != nil {
		utils.GinResponse(c).FailedWithErr("参数错误", err)
		return
	}

	data, _ := json.Marshal(p)

	var ent entity.Setting
	ent.Code = "SERVER_SETTING"
	ent.Data = string(data)
	if err := repository.System().Save(&ent); err != nil {
		utils.GinResponse(c).FailedWithErr("操作失败", err)
		return
	}

	go func() {
		if err := queues.PutAsyncWireguardConfigFile(""); err != nil {
			log.Errorf("[设置服务端],发起同步配置文件失败: %v", err.Error())
		}
	}()

	utils.GinResponse(c).OK()
}

// GetGlobalSetting
// @description: 获取全局设置配置
// @receiver setting
// @param c
func (setting) GetGlobalSetting(c *gin.Context) {
	data, err := repository.System().GetServerSetting()
	if err != nil {
		log.Errorf("获取配置失败: %v", err.Error())
	}

	utils.GinResponse(c).OKWithData(data)
}

// GetPublicNetworkIP
// @description: 获取当前机器的公网IP
// @receiver setting
// @param c
func (setting) GetPublicNetworkIP(c *gin.Context) {
	utils.GinResponse(c).OKWithData(map[string]string{
		"IP": utils.Network().GetHostPublicIP(),
	})
}
