package compatibility

import (
	"reflect"
	"strings"
	"testing"

	runtimev1 "github.com/pingcap-inc/nexuscrm-contract/wire-go/gen/runtime/v1"
	"google.golang.org/protobuf/reflect/protoreflect"
)

func TestFederatedLoginTransactionWireIsMinimalProviderNeutralAndConsumable(t *testing.T) {
	begin := (&runtimev1.BeginFederatedLoginRequest{}).ProtoReflect().Descriptor()
	assertFieldNames(t, begin.Fields(), []protoreflect.Name{"app_installation_id", "redirect_uri"})
	beginResponse := (&runtimev1.BeginFederatedLoginResponse{}).ProtoReflect().Descriptor()
	assertFieldNames(t, beginResponse.Fields(), []protoreflect.Name{"state", "expires_at_unix_second"})
	consume := (&runtimev1.ConsumeFederatedLoginRequest{}).ProtoReflect().Descriptor()
	assertFieldNames(t, consume.Fields(), []protoreflect.Name{"app_installation_id", "state", "redirect_uri"})

	service := begin.ParentFile().Services().ByName("FederatedLoginTransactionService")
	if service == nil {
		t.Fatal("FederatedLoginTransactionService is absent")
	}
	got := make([]protoreflect.Name, service.Methods().Len())
	for index := range service.Methods().Len() {
		got[index] = service.Methods().Get(index).Name()
	}
	if want := []protoreflect.Name{"BeginFederatedLogin", "ConsumeFederatedLogin"}; !reflect.DeepEqual(got, want) {
		t.Fatalf("methods = %v, want %v", got, want)
	}

	for _, descriptor := range []protoreflect.MessageDescriptor{begin, beginResponse, consume} {
		for index := 0; index < descriptor.Fields().Len(); index++ {
			name := strings.ToLower(string(descriptor.Fields().Get(index).Name()))
			for _, forbidden := range []string{"google", "provider", "code", "token", "secret"} {
				if strings.Contains(name, forbidden) {
					t.Fatalf("provider/exchange field %q entered %s", name, descriptor.FullName())
				}
			}
		}
	}
}
