package server

import (
	"testing"

	"buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate"
	"google.golang.org/grpc/status"
)

func contains(array []*validate.Violation, err *validate.Violation) bool {
	for _, v := range array {
		if isEqualFieldPaths(v.Field, err.Field) && *v.ConstraintId == *err.ConstraintId && *v.Message == *err.Message {
			return true
		}
	}

	return false
}

func isEqualFieldPaths(violationFieldPath, errFieldPath *validate.FieldPath) bool {
	if len(violationFieldPath.GetElements()) != len(errFieldPath.GetElements()) {
		return false
	}

	for i, elem := range violationFieldPath.GetElements() {
		if elem != errFieldPath.GetElements()[i] {
			return false
		}
	}

	return true
}

func assertValidationErrors(t *testing.T, err error, expectedValidationErrors []*validate.Violation) {
	st := status.Convert(err)
	errDetails := st.Details()

	for _, detail := range errDetails {
		switch errorType := detail.(type) {
		case *validate.Violations:
			for _, violation := range errorType.Violations {
				ok := contains(expectedValidationErrors, violation)
				if !ok {
					t.Errorf("Received unexptected validation error: %v, expected %v", violation, expectedValidationErrors)
				}
			}
		}
	}
}