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/privatelinkendpoint

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

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

// Delete CR godoc
// @Summary Delete PrivateLinkEndpoint CR
// @Schemes
// @Description Delete PrivateLinkEndpoint CR
// @Tags regional_privatelinkendpoint_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 /privatelinkendpoint/cr [delete]
func DeletePrivateLinkEndpointCR(c *gin.Context) {
	ctx := c.Request.Context()
	namespace := c.Query("namespace")
	name := c.Query("name")
	tilog.Info(ctx, "DeletePrivateLinkEndpointCR payload:", zap.String("namespace", namespace), zap.String("name", name))
	err := service.DeletePrivateLinkEndpointCR(ctx, namespace, name)
	if err != nil {
		c.Error(err)
		tilog.Error(ctx, "DeletePrivateLinkEndpointCR 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)
}
