package message

import (
	"errors"

	regionalapiv1 "github.com/tidbcloud/infra-provider/api/tidbcloud/regional-server/v1"
	"github.com/tidbcloud/infra-provider/regional-server/pkg/common/utils"
)

type CreateVPCReqValidatable struct {
	*regionalapiv1.CreateVpcRequest
}

func (c *CreateVPCReqValidatable) Validate() error {
	if c == nil {
		return errors.New("request is nil")
	}
	if c.RequestId == "" {
		return errors.New("requestId is empty")
	}
	if c.Vpc == nil {
		return errors.New("vpc is nil")
	}
	if c.Vpc.CidrBlock == "" {
		return errors.New("cidrBlock is empty")
	}
	if len(c.Vpc.TenantIds) == 0 {
		return errors.New("tenantIds is empty")
	}
	if len(c.Vpc.ProjectIds) == 0 {
		return errors.New("projectIds is empty")
	}
	return nil
}

type ListVPCReqValidatable struct {
	*regionalapiv1.ListVpcsRequest
}

func (r *ListVPCReqValidatable) Validate() error {
	if r == nil {
		return errors.New("request is nil")
	}
	if r.TenantId == "" {
		return errors.New("tenantId is empty")
	}
	return nil
}

type QueryVpcClusterIdsRequestValidatable struct {
	*regionalapiv1.QueryVpcClusterIdsRequest
}

func (r *QueryVpcClusterIdsRequestValidatable) Validate() error {
	if r == nil {
		return errors.New("request is nil")
	}
	if r.TenantId == "" {
		return errors.New("tenantId is empty")
	}
	if aws := r.GetAws(); aws != nil {
		if aws.AccountId == "" || aws.VpcId == "" {
			return errors.New("accountId or vpcId is empty")
		}
	}
	if gcp := r.GetGcp(); gcp != nil {
		if gcp.NetworkName == "" || gcp.ProjectId == "" {
			return errors.New("networkName or projectId is empty")
		}
	}
	return nil
}

type DeleteVPCValidatable struct {
	*regionalapiv1.DeleteVpcRequest
}

func (r *DeleteVPCValidatable) Validate() error {
	if r == nil {
		return errors.New("request is nil")
	}
	if r.VpcId == "" {
		return errors.New("vpcId is empty")
	}
	return nil
}

type GetVPCReqValidatable struct {
	*regionalapiv1.GetVpcRequest
}

func (r *GetVPCReqValidatable) Validate() error {
	if r == nil {
		return errors.New("request is nil")
	}
	if r.VpcId == "" {
		return errors.New("vpcId is empty")
	}
	return nil
}

type AddSecondaryCidrRequestValidatable struct {
	*regionalapiv1.AddSecondaryCidrRequest
}

func (r *AddSecondaryCidrRequestValidatable) Validate() error {
	if r == nil {
		return errors.New("request is nil")
	}
	if r.VpcId == "" {
		return errors.New("vpcId is empty")
	}
	if r.SecondaryCidr == "" {
		return errors.New("secondaryCidr is empty")
	}
	if !utils.IsValidCIDR(r.SecondaryCidr) {
		return errors.New("secondaryCidr is not a valid IPv4 CIDR")
	}
	return nil
}
