package v1

import (
	"cmdb-backend/models"
	"cmdb-backend/pkg/utils"
	"net/http"
	"sort"
	"strconv"

	"github.com/gin-gonic/gin"
)

func GetAppList(c *gin.Context) {
	resp := utils.SelectResponse{
		Options: []utils.SelectOption{},
	}
	options := map[string]utils.SelectOption{}

	userList := models.GetAppName()
	for _, app := range userList {
		options[app.Name] = utils.SelectOption{
			Label: app.Name,
			Value: app.Name,
		}
	}

	for _, option := range options {
		resp.Options = append(resp.Options, option)
	}
	sort.Sort(resp.Options)

	c.JSON(http.StatusOK, utils.AmisResponse{
		Data: resp,
	})
}

func GetAppInfoList(c *gin.Context) {
	category := c.Query("category")
	key := c.Query("key")
	pageNum, _ := strconv.Atoi(c.Query("page_number"))
	pageSize, _ := strconv.Atoi(c.Query("page_size"))

	appList := models.GetApp(category, key, utils.GetPage(pageNum, pageSize), pageSize)
	total := models.GetAppTotal(category, key)

	c.JSON(http.StatusOK, utils.AmisResponse{
		Data: map[string]interface{}{
			"items": appList,
			"total": total,
		},
	})
}

func CreateApp(c *gin.Context) {
	query := models.Application{}
	if err := c.ShouldBindJSON(&query); err != nil {
		utils.AmisError(c, "数据格式不正确，请修改后重新提交。")
		return
	}
	if query.Name == "" {
		utils.AmisError(c, "应用名称不能为空。")
		return
	}

	if err := models.CreateApp(&query); err != nil {
		utils.AmisError(c, "create app failed !")
		return
	}

	c.JSON(http.StatusOK, utils.AmisResponse{
		Msg: "应用添加成功。",
	})
}

func UpdateApp(c *gin.Context) {
	query := models.Application{}
	if err := c.ShouldBindJSON(&query); err != nil {
		utils.AmisError(c, "数据格式不正确，请修改后重新提交。")
		return
	}
	if query.Name == "" {
		utils.AmisError(c, "应用名称不能为空。")
		return
	}

	if err := models.UpdateApp(query); err != nil {
		utils.AmisError(c, "update app failed !")
		return
	}

	c.JSON(http.StatusOK, utils.AmisResponse{
		Msg: "应用更新成功。",
	})
}

func DeleteApp(c *gin.Context) {
	query := models.Application{}
	if err := c.ShouldBindJSON(&query); err != nil {
		utils.AmisError(c, "数据格式不正确，请修改后重新提交。")
		return
	}
	if query.Name == "" {
		utils.AmisError(c, "应用名称不能为空。")
		return
	}

	//判断应用是否有关联的资源，如果有，则不允许删除
	if total := models.GetAppResourceTotal(query.Name); total > 0 {
		utils.AmisError(c, "应用下存在资源，请先删除资源。")
		return
	}

	if err := models.DeleteApp(query.Id); err != nil {
		utils.AmisError(c, "delete app failed !")
		return
	}

	c.JSON(http.StatusOK, utils.AmisResponse{
		Msg: "应用删除成功。",
	})
}

func GetAppResourceList(c *gin.Context) {
	appName := c.Param("app_name")
	pageNum, _ := strconv.Atoi(c.Query("page_number"))
	pageSize, _ := strconv.Atoi(c.Query("page_size"))
	appResourceList := models.GetAppResource(appName, utils.GetPage(pageNum, pageSize), pageSize)
	total := models.GetAppResourceTotal(appName)

	c.JSON(http.StatusOK, utils.AmisResponse{
		Data: map[string]interface{}{
			"items": appResourceList,
			"total": total,
		},
	})
}
