package validation

import (
	"slices"

	privent "github.com/tidbcloud/devops/entity/privilege"
)

var (
	Privilege = privilegeValidator{}
)

type privilegeValidator struct{}

func (v privilegeValidator) Privilege(priv *privent.Privilege) error {

	if !slices.Contains(privent.PrivilegeTypeValues, priv.Type) {
		return ErrInvalid("type", priv.Type)
	}

	if priv.Source == "" {
		return ErrRequired("source")
	}

	if !slices.Contains(privent.PrivilegePhaseValues, priv.Phase) {
		return ErrInvalid("phase", priv.Phase)
	}

	var err error
	switch priv.Type {
	case privent.PrivilegeTypeApproval:
		err = v.ApprovalPrivilegeContent(priv.Content.Approval)
	}
	if err != nil {
		return err
	}

	return nil
}

func (v privilegeValidator) ApprovalPrivilegeContent(content *privent.ApprovalPrivilegeContent) error {
	if content == nil {
		return ErrRequired("approval content")
	}

	if len(content.Scopes) == 0 {
		return ErrRequired("scopes")
	}

	for _, scope := range content.Scopes {
		if !slices.Contains(privent.ApprovalPrivilegeScopeValues, scope) {
			return ErrInvalid("scope", scope)
		}
	}

	return nil
}
