package internet

import (
	"net/http"

	"github.com/gin-gonic/gin"
	bizerr "github.com/tidbcloud/infra-provider/regional-server/pkg/common/errors"
	"github.com/tidbcloud/infra-provider/regional-server/pkg/common/message"
	rsconfig "github.com/tidbcloud/infra-provider/regional-server/pkg/config"
	resinternet "github.com/tidbcloud/infra-provider/regional-server/pkg/resourcemanager/internet"
	resvpc "github.com/tidbcloud/infra-provider/regional-server/pkg/resourcemanager/vpc"
	"github.com/tidbcloud/infra-provider/regional-server/pkg/router/interceptor"
	sevinternet "github.com/tidbcloud/infra-provider/regional-server/pkg/service/internet"
	"sigs.k8s.io/controller-runtime/pkg/client"
)

type InternetHandler struct {
	internetsvc *sevinternet.InternetService
	config      rsconfig.RootConfig
}

func NewInternetHandler(cli client.Client, config rsconfig.RootConfig) *InternetHandler {
	return &InternetHandler{
		internetsvc: sevinternet.NewInternetService(
			resinternet.NewInternetReaderWriter(cli),
			resvpc.NewVPCReader(cli),
			config,
		),
		config: config,
	}
}

func (r *InternetHandler) CreateInternet(c *gin.Context) {
	req := &message.CreateInternetReq{}
	if ok := interceptor.HandleJsonRequestFromBody(c, req); !ok {
		return
	}
	if err := req.Validate(); err != nil {
		interceptor.Fail(c, bizerr.New(bizerr.ParameterInvalid, err.Error()))
		return
	}
	resp, err := r.internetsvc.CreateInternet(c, req)
	if err != nil {
		interceptor.Fail(c, err)
		return
	}
	interceptor.Succeed(c, http.StatusAccepted, resp)
}

func (r *InternetHandler) DeleteInternet(c *gin.Context) {
	req := &message.DeleteInternetReq{
		Name:      c.Param("name"),
		Namespace: c.Param("namespace"),
	}
	if err := req.Validate(); err != nil {
		interceptor.Fail(c, bizerr.New(bizerr.ParameterInvalid, err.Error()))
		return
	}
	if err := r.internetsvc.DeleteInternet(c, req); err != nil {
		interceptor.Fail(c, err)
		return
	}
	interceptor.Succeed(c, http.StatusOK, nil)
}

func (r *InternetHandler) GetInternet(c *gin.Context) {
	req := &message.GetInternetReq{
		Name:      c.Param("name"),
		Namespace: c.Param("namespace"),
	}
	if err := req.Validate(); err != nil {
		interceptor.Fail(c, bizerr.New(bizerr.ParameterInvalid, err.Error()))
		return
	}
	resp, err := r.internetsvc.GetInternet(c, req)
	if err != nil {
		interceptor.Fail(c, err)
		return
	}
	interceptor.Succeed(c, http.StatusOK, resp)
}
