package message

import (
	"errors"

	regionalapipb "github.com/tidbcloud/infra-provider/api/tidbcloud/regional-server/v1"
)

type AWSInfoValidatable struct {
	*regionalapipb.VpcPeering_Aws
}

func (info *AWSInfoValidatable) Validate() error {
	if info.SourceAccountId == "" {
		return errors.New("aws.sourceAccountId is empty")
	}
	if info.SourceVpcId == "" {
		return errors.New("aws.sourceVpcId is empty")
	}
	if info.DestinationAccountId == "" {
		return errors.New("aws.destinationAccountId is empty")
	}
	if info.DestinationVpcId == "" {
		return errors.New("aws.destinationVpcId is empty")
	}
	return nil
}

type GCPInfoValidatable struct {
	*regionalapipb.VpcPeering_Gcp
}

func (info *GCPInfoValidatable) Validate() error {
	if info.SourceProjectId == "" {
		return errors.New("gcp.sourceProjectId is empty")
	}
	if info.SourceNetworkName == "" {
		return errors.New("gcp.sourceNetworkName is empty")
	}
	if info.DestinationProjectId == "" {
		return errors.New("gcp.destinationProjectId is empty")
	}
	if info.DestinationNetworkName == "" {
		return errors.New("gcp.destinationNetworkName is empty")
	}
	return nil
}

type CreateVpcPeeringReqValidatable struct {
	*regionalapipb.CreateVpcPeeringRequest
}

func (req *CreateVpcPeeringReqValidatable) Validate() error {
	if req.VpcPeering == nil {
		return errors.New("vpcPeering is nil")
	}
	if req.VpcPeering.GetAws() == nil && req.VpcPeering.GetGcp() == nil {
		return errors.New("aws and gcp info are all nil")
	}
	if req.VpcPeering.Id == "" {
		return errors.New("id is empty")
	}
	if req.VpcPeering.TenantId == "" {
		return errors.New("tenantId is empty")
	}
	if req.VpcPeering.ProjectId == "" {
		return errors.New("projectId is empty")
	}
	if req.VpcPeering.DestinationCidrBlock == "" {
		return errors.New("customerCidrBlock is empty")
	}
	return nil
}

type GetVpcPeeringReqValidatable struct {
	*regionalapipb.GetVpcPeeringRequest
}

func (req *GetVpcPeeringReqValidatable) Validate() error {
	if req.VpcPeeringId == "" {
		return errors.New("vpcPeeringId is empty")
	}
	return nil
}

type DeleteVpcPeeringReqValidatable struct {
	*regionalapipb.DeleteVpcPeeringRequest
}

func (req *DeleteVpcPeeringReqValidatable) Validate() error {
	if req.VpcPeeringId == "" {
		return errors.New("vpcPeeringId is empty")
	}
	return nil
}

// TODO(shenjun) list by lables??
type ListVpcPeeringReqValidatable struct {
	*regionalapipb.ListVpcPeeringsRequest
}

func (req *ListVpcPeeringReqValidatable) Validate() error {
	if len(req.TenantId) == 0 {
		return errors.New("tenantId is empty")
	}
	return nil
}

type AcceptVpcPeeringReqValidatable struct {
	*regionalapipb.AcceptVpcPeeringRequest
}

func (req *AcceptVpcPeeringReqValidatable) Validate() error {
	if req.VpcPeeringId == "" {
		return errors.New("vpcPeeringId is empty")
	}
	if req.AccepterVpcId == "" {
		return errors.New("vpcPeeringId is empty")
	}
	if req.RequesterVpcCidr == "" {
		return errors.New("requesterVpcCidrBlock is empty")
	}
	return nil
}
