package controller

import (
	"net/http"
	"tcidm/internal/dto"
	"tcidm/internal/service"

	"github.com/gin-gonic/gin"
	"github.com/gin-gonic/gin/binding"
	"github.com/tidbcloud/eks-provider/api/v1alpha1"
	"github.com/tidbcloud/tiinf/errs"
	"github.com/tidbcloud/tiinf/monitor/tilog"
	"go.uber.org/zap"
)

// @BasePath /api/v1/tcidm/dmjob

// Get DMJob CR godoc
// @Summary Get DMJob CR
// @Schemes
// @Description Get DMJob CR
// @Tags regional_dmjob_service
// @Param namespace query string true "value: ns"
// @Param name query string true "value: name"
// @Accept json
// @Produce json
// @Success 200 {object} dto.GetDMJobCRRes
// @Router /dmjob/cr [get]
func GetDMJobCR(c *gin.Context) {
	ctx := c.Request.Context()
	namespace := c.Query("namespace")
	name := c.Query("name")
	tilog.Info(ctx, "GetDMJobCR payload:", zap.String("namespace", namespace), zap.String("name", name))
	cr, err := service.GetDMJobCR(ctx, namespace, name)
	if err != nil {
		tilog.Error(ctx, "GetDMJobCR Failed!", zap.String("namespace", namespace), zap.String("name", name), zap.Error(err))
		c.Error(err)
		return
	}
	res := &dto.GetDMJobCRRes{
		BasicRes: dto.DefaultSuccessBasicRes(),
		Data:     cr,
	}
	c.JSON(http.StatusOK, res)
}

// Create DMJob CR godoc
// @Summary Create DMJob CR
// @Schemes
// @Description Create DMJob CR
// @Tags regional_dmjob_service
// @Param request_body body cloudv1.DMJob true "request_body"
// @Accept json
// @Produce json
// @Success 200 {object} dto.SuccessRes
// @Router /dmjob/cr [post]
func CreateDMJobCR(c *gin.Context) {
	ctx := c.Request.Context()
	var input v1alpha1.DMJob
	err := c.ShouldBindBodyWith(&input, binding.JSON)
	if err != nil {
		tilog.Error(ctx, "CreateDMJobCR param bind failed!", zap.Any("param", input), zap.Error(err))
		c.Error(errs.NewBadRequest("Bind Params Failed", err))
		return
	}
	tilog.Info(ctx, "CreateDMJobCR payload: ", zap.Any("param", input))
	err = service.CreateDMJobCR(ctx, &input)
	if err != nil {
		c.Error(err)
		tilog.Error(ctx, "CreateDMJobCR Failed!", zap.Error(err))
		return
	}
	res := &dto.SuccessRes{
		BasicRes: dto.DefaultSuccessBasicRes(),
		Data:     "ok",
	}
	c.JSON(http.StatusOK, res)
}

// Update DMJob CR godoc
// @Summary Update DMJob CR
// @Schemes
// @Description Update DMJob CR
// @Tags regional_dmjob_service
// @Param request_body body cloudv1.DMJob true "request_body"
// @Accept json
// @Produce json
// @Success 200 {object} dto.SuccessRes
// @Router /dmjob/cr [put]
func UpdateDMJobCR(c *gin.Context) {
	ctx := c.Request.Context()
	var input v1alpha1.DMJob
	err := c.ShouldBindBodyWith(&input, binding.JSON)
	if err != nil {
		tilog.Error(ctx, "UpdateDMJobCR param bind failed!", zap.Any("param", input), zap.Error(err))
		c.Error(errs.NewBadRequest("Bind Params Failed", err))
		return
	}
	tilog.Info(ctx, "UpdateDMJobCR payload: ", zap.Any("param", input))
	err = service.UpdateDMJobCR(ctx, &input)
	if err != nil {
		c.Error(err)
		tilog.Error(ctx, "UpdateDMJobCR Failed!", zap.Error(err))
		return
	}
	res := &dto.SuccessRes{
		BasicRes: dto.DefaultSuccessBasicRes(),
		Data:     "ok",
	}
	c.JSON(http.StatusOK, res)
}

// Delete CR godoc
// @Summary Delete DMJob CR
// @Schemes
// @Description Delete DMJob CR
// @Tags regional_dmjob_service
// @Param namespace query string true "value: ns"
// @Param name query string true "value: name"
// @Accept json
// @Produce json
// @Success 200 {object} dto.SuccessRes
// @Router /dmjob/cr [delete]
func DeleteDMJobCR(c *gin.Context) {
	ctx := c.Request.Context()
	namespace := c.Query("namespace")
	name := c.Query("name")
	tilog.Info(ctx, "DeleteDMJobCR payload:", zap.String("namespace", namespace), zap.String("name", name))
	err := service.DeleteDMJobCR(ctx, namespace, name)
	if err != nil {
		c.Error(err)
		tilog.Error(ctx, "DeleteDMJobCR Failed!", zap.String("namespace", namespace), zap.String("name", name), zap.Error(err))
		return
	}
	res := &dto.SuccessRes{
		BasicRes: dto.DefaultSuccessBasicRes(),
		Data:     "ok",
	}
	c.JSON(http.StatusOK, res)
}
