package network

import (
	"net/http"

	"github.com/gin-gonic/gin"
	regionalapiv1 "github.com/tidbcloud/infra-provider/api/tidbcloud/regional-server/v1"
	bizerr "github.com/tidbcloud/infra-provider/regional-server/pkg/common/errors"
	"github.com/tidbcloud/infra-provider/regional-server/pkg/common/message"
	"github.com/tidbcloud/infra-provider/regional-server/pkg/router/interceptor"
	svcnetwork "github.com/tidbcloud/infra-provider/regional-server/pkg/service/network"
)

type NetworkHandler struct {
	networksvc *svcnetwork.NetworkService
}

func NewNetworkHandler(networksvc *svcnetwork.NetworkService) *NetworkHandler {
	return &NetworkHandler{
		networksvc: networksvc,
	}
}

func (r *NetworkHandler) GetNetwork(c *gin.Context) {
	req := &regionalapiv1.GetCompatNetworkRequest{
		VpcId: c.Param("vpcId"),
	}

	if req.VpcId == "" {
		interceptor.Fail(c, bizerr.New(bizerr.ParameterInvalid, "vpcId is required"))
		return
	}

	resp, err := r.networksvc.GetNetwork(c, req)
	if err != nil {
		interceptor.Fail(c, err)
		return
	}
	interceptor.SucceedPb(c, http.StatusOK, resp)
}

func (r *NetworkHandler) GetRegionConfig(c *gin.Context) {
	resp := r.networksvc.GetRegionConfig(c)
	interceptor.SucceedPb(c, http.StatusOK, resp)
}

func (r *NetworkHandler) DeleteNetwork(c *gin.Context) {
	req := &message.DeleteNetworkReq{}
	if ok := interceptor.HandleJsonRequestFromBody(c, req); !ok {
		return
	}
	if err := req.Validate(); err != nil {
		interceptor.Fail(c, bizerr.New(bizerr.ParameterInvalid, err.Error()))
		return
	}

	if err := r.networksvc.DeleteNetwork(c, req); err != nil {
		interceptor.Fail(c, err)
		return
	}
	interceptor.Succeed(c, http.StatusOK, nil)
}
