package controller

import (
	"fmt"
	"strconv"

	"github.com/gin-gonic/gin"

	"github.com/pingcap/enterprise-toolkit/tispector/code"
	"github.com/pingcap/enterprise-toolkit/tispector/service/db_info"
)

func ListDB(ctx *gin.Context) Resp {
	f := "ListDB()-->"

	dbInfo, err := db_info.ListAllDB()
	if err != nil {
		return Resp{Message: fmt.Sprintf("%s,list db failed :%s ", f, err.Error()), Code: code.ParamInvalid}
	}

	return Resp{Data: dbInfo}
}

func ListCluster(ctx *gin.Context) Resp {
	f := "ListCluster()-->"

	cluster, err := db_info.ListCluster()
	if err != nil {
		return Resp{Message: fmt.Sprintf("%s,list cluster failed :%s ", f, err.Error()), Code: code.ParamInvalid}
	}

	return Resp{
		Code:    code.Success,
		Message: fmt.Sprintf("ListCluster Success"),
		Data: ListData{
			Items:  cluster,
			Total:  len(cluster),
			More:   false,
			Offset: 0,
		}}
}

func AddCluster(ctx *gin.Context) Resp {
	f := "AddCluster()-->"

	var cluster db_info.DbInjectionCluster
	if err := ctx.BindJSON(&cluster); err != nil {
		return Resp{Message: fmt.Sprintf("%s, parse param failed :%s ", f, err.Error()), Code: code.ParamInvalid}
	}

	id, err := db_info.AddCluster(&cluster)
	if err != nil {
		return Resp{Message: fmt.Sprintf("%s,add cluster failed :%s ", f, err.Error()), Code: code.ParamInvalid}
	}

	return Resp{Code: code.Success,
		Message: fmt.Sprintf("AddCluster Success"),
		Data:    id}
}

func UpdateCluster(ctx *gin.Context) Resp {
	f := "UpdateCluster()-->"

	var cluster db_info.DbInjectionCluster
	if err := ctx.BindJSON(&cluster); err != nil {
		return Resp{Message: fmt.Sprintf("%s, parse param failed :%s ", f, err.Error()), Code: code.ParamInvalid}
	}

	oldClusters, err := db_info.ListCluster()
	if err != nil {
		return Resp{Message: fmt.Sprintf("%s,add cluster failed :%s ", f, err.Error()), Code: code.ParamInvalid}
	}
	for _, oldCluster := range oldClusters {
		if cluster.ID == oldCluster.ID {
			if err := db_info.UpdateCluster(&cluster); err != nil {
				return Resp{Message: fmt.Sprintf("%s,update cluster failed :%s ", f, err.Error()), Code: code.ParamInvalid}
			}

			return Resp{Code: code.Success,
				Message: fmt.Sprintf("UpdateCluster Success")}
		}
	}
	return Resp{Message: fmt.Sprintf("add cluster failed ,ID %s not exists ", cluster.ID), Code: code.ParamInvalid}
}

func DelCluster(ctx *gin.Context) Resp {
	f := "DelCluster()-->"

	idStr := ctx.Query("id")
	id, err := strconv.ParseInt(idStr, 10, 64)
	if err != nil {
		return Resp{
			Message: fmt.Sprintf("%s, get param failed :%s, id: %s ", f, err.Error(), idStr),
			Code:    code.ParamInvalid,
		}
	}

	oldClusters, err := db_info.ListCluster()
	if err != nil {
		return Resp{Message: fmt.Sprintf("%s,add cluster failed :%s ", f, err.Error()), Code: code.ParamInvalid}
	}
	for _, oldCluster := range oldClusters {
		if id == oldCluster.ID {
			if err := db_info.DelCluster(id); err != nil {
				return Resp{Message: fmt.Sprintf("%s,del cluster failed :%s ", f, err.Error()), Code: code.ParamInvalid}
			}

			return Resp{Code: code.Success,
				Message: fmt.Sprintf("DelCluster Success")}
		}
	}
	return Resp{Message: fmt.Sprintf("del cluster failed : ID %s 不存在  ", idStr), Code: code.ParamInvalid}
}

// GetClusterByName 通过name获取单挑cluster信息
func GetClusterByName(ctx *gin.Context) Resp {
	clusterNameStr := ctx.Query("name")
	var clusterInfo *db_info.DbInjectionCluster
	clusterInfo, err := db_info.GetClusterByName(clusterNameStr)
	if err != nil {
		return Resp{Message: fmt.Sprintf("Get Cluster %s Failed : %s", clusterNameStr, err.Error()), Code: code.ParamInvalid}
	}
	var clusterInfos []db_info.DbInjectionCluster
	clusterInfos = append(clusterInfos, *clusterInfo)
	return Resp{Code: code.Success, Message: fmt.Sprintf("Get Cluster %s Success", clusterNameStr), Data: clusterInfos}
}
