package tepapis

import (
	"fmt"
	"net/http"

	"github.com/gin-gonic/gin"
	"github.com/pingcap/tep/pkg/apis/apiserver/v1alpha1"
	"github.com/pingcap/tep/pkg/utils"
)

func (api *API) CreateScheduledBackup(c *gin.Context) {
	ns := utils.GetHTTPParameter(c.Param, "namespace")

	scheduleBackup := &v1alpha1.TiDBClusterScheduledBackup{}
	if err := c.ShouldBindJSON(scheduleBackup); err != nil {
		msg := fmt.Sprintf("invalid request body: %v", err)
		utils.SendMsg(c, nil, utils.NewAPIStatus(http.StatusBadRequest, msg))
		return
	}

	resp, status := api.Server.CreateScheduledBackup(ns, scheduleBackup)
	utils.SendMsg(c, resp, status)
}

func (api *API) CreateBackup(c *gin.Context) {
	ns := utils.GetHTTPParameter(c.Param, "namespace")

	backup := &v1alpha1.TiDBClusterBackup{}
	if err := c.ShouldBindJSON(backup); err != nil {
		msg := fmt.Sprintf("invalid request body: %v", err)
		utils.SendMsg(c, nil, utils.NewAPIStatus(http.StatusBadRequest, msg))
		return
	}

	resp, status := api.Server.CreateBackup(ns, backup)
	utils.SendMsg(c, resp, status)
}

func (api *API) CreateRestore(c *gin.Context) {
	ns := utils.GetHTTPParameter(c.Param, "namespace")

	restore := &v1alpha1.TiDBClusterRestore{}
	if err := c.ShouldBindJSON(restore); err != nil {
		msg := fmt.Sprintf("invalid request body: %v", err)
		utils.SendMsg(c, nil, utils.NewAPIStatus(http.StatusBadRequest, msg))
		return
	}

	resp, status := api.Server.CreateRestore(ns, restore)
	utils.SendMsg(c, resp, status)
}

func (api *API) UpdateScheduledBackup(c *gin.Context) {
	ns := utils.GetHTTPParameter(c.Param, "namespace")

	schedule := &v1alpha1.TiDBClusterScheduledBackup{}
	if err := c.ShouldBindJSON(schedule); err != nil {
		msg := fmt.Sprintf("invalid request body: %v", err)
		utils.SendMsg(c, nil, utils.NewAPIStatus(http.StatusBadRequest, msg))
		return
	}

	resp, status := api.Server.UpdateScheduledBackup(ns, schedule)
	utils.SendMsg(c, resp, status)
}

func (api *API) GetScheduledBackup(c *gin.Context) {
	ns := utils.GetHTTPParameter(c.Param, "namespace")

	resp, status := api.Server.GetScheduledBackup(ns)
	utils.SendMsg(c, resp, status)
}
