package k8sresource

import (
	"strings"

	regionalpb "github.com/tidbcloud/infra-provider/api/tidbcloud/regional-server/v1"
	bizerr "github.com/tidbcloud/infra-provider/regional-server/pkg/common/errors"
)

func validateRequest(req *regionalpb.ListK8SResourcesRequest) error {
	if req == nil {
		return bizerr.New(bizerr.ParameterInvalid, "request is required")
	}
	if req.PlaneType == regionalpb.PlaneType_PLANE_TYPE_UNSPECIFIED {
		return bizerr.New(bizerr.ParameterInvalid, "plane_type is required")
	}
	if req.Gvk == nil {
		return bizerr.New(bizerr.ParameterInvalid, "gvk is required")
	}
	if strings.TrimSpace(req.Gvk.Kind) == "" {
		return bizerr.New(bizerr.ParameterInvalid, "gvk.kind is required")
	}
	if req.Selector == nil {
		return bizerr.New(bizerr.ParameterInvalid, "selector is required")
	}
	if err := validateSelectorField(req.Selector); err != nil {
		return err
	}
	if req.PlaneType == regionalpb.PlaneType_DATA_PLANE {
		if req.DataPlane == nil {
			return bizerr.New(bizerr.ParameterInvalid, "data_plane is required when plane_type is DATA_PLANE")
		}
		if strings.TrimSpace(req.DataPlane.ProjectId) == "" && strings.TrimSpace(req.DataPlane.ClusterId) == "" {
			return bizerr.New(bizerr.ParameterInvalid, "data_plane.project_id or data_plane.cluster_id is required when plane_type is DATA_PLANE")
		}
	}
	return validateOption(req.Option)
}

func validateSelectorField(sel *regionalpb.Selector) error {
	if sel == nil {
		return nil
	}
	if strings.TrimSpace(sel.Name) != "" {
		return nil
	}
	return validateFieldFilters(sel.Field)
}

func validateOption(opt *regionalpb.Option) error {
	if opt == nil {
		return nil
	}
	if opt.Events && !opt.Detail {
		return bizerr.New(bizerr.ParameterInvalid, "option.events requires option.detail=true")
	}
	if _, err := resolveListLimit(opt, isDetail(opt)); err != nil {
		return err
	}
	return nil
}

func isDetail(opt *regionalpb.Option) bool {
	return opt != nil && opt.Detail
}
