package byocvpcpeering

import (
	"context"

	globalngv1 "github.com/tidbcloud/tidb-management-service/api/spec/global/nextgen/v1"
	"github.com/tidbcloud/tidb-management-service/nextgen-global-service/domain/service/byocvpcpeering"
	"github.com/tidbcloud/tidb-management-service/utilities/bizerr"
)

func NewServer(svc byocvpcpeering.Service) globalngv1.ByocVpcPeeringServiceServer {
	return &server{Service: svc}
}

type server struct {
	byocvpcpeering.Service
}

func (s *server) ListVpcPeerings(
	ctx context.Context,
	req *globalngv1.ListVpcPeeringsRequest,
) (*globalngv1.ListVpcPeeringsResponse, error) {
	peerings, err := s.Service.ListVpcPeerings(ctx, req)
	if err != nil {
		return nil, err
	}

	resp := &globalngv1.ListVpcPeeringsResponse{}
	for _, each := range peerings {
		resp.VpcPeerings = append(resp.VpcPeerings, each.VpcPeering)
	}
	return resp, nil
}

func (s *server) GetVpcPeering(ctx context.Context, req *globalngv1.GetVpcPeeringRequest) (*globalngv1.VpcPeering, error) {
	peering, err := s.Service.GetVpcPeering(ctx, req)
	if err != nil {
		return nil, err
	}
	if peering == nil || peering.VpcPeering == nil {
		return nil, bizerr.New(bizerr.ErrCodeRecordNotFound, "vpc peering not found")
	}
	return peering.VpcPeering, nil
}

func (s *server) GetVpcPeeringAllowlistSetting(
	ctx context.Context,
	req *globalngv1.GetVpcPeeringAllowlistSettingRequest,
) (*globalngv1.VpcPeeringAllowlistSetting, error) {
	setting, err := s.Service.GetVpcPeeringAllowlistSetting(ctx, req)
	if err != nil {
		return nil, err
	}
	if setting == nil || setting.VpcPeeringAllowlistSetting == nil {
		return nil, bizerr.New(bizerr.ErrCodeRecordNotFound, "vpc peering allowlist setting not found")
	}
	return setting.VpcPeeringAllowlistSetting, nil
}

func (s *server) UpdateVpcPeeringAllowlistSetting(
	ctx context.Context,
	req *globalngv1.UpdateVpcPeeringAllowlistSettingRequest,
) (*globalngv1.VpcPeeringAllowlistSetting, error) {
	setting, err := s.Service.UpdateVpcPeeringAllowlistSetting(ctx, req)
	if err != nil {
		return nil, err
	}
	if setting == nil || setting.VpcPeeringAllowlistSetting == nil {
		return nil, bizerr.New(bizerr.ErrCodeUnknown, "failed to update vpc peering allowlist setting")
	}
	return setting.VpcPeeringAllowlistSetting, nil
}
