//
// Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
// Ministerpräsidenten des Landes Schleswig-Holstein
// Staatskanzlei
// Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
//
// Lizenziert unter der EUPL, Version 1.2 oder - sobald
// diese von der Europäischen Kommission genehmigt wurden -
// Folgeversionen der EUPL ("Lizenz");
// Sie dürfen dieses Werk ausschließlich gemäß
// dieser Lizenz nutzen.
// Eine Kopie der Lizenz finden Sie hier:
//
// https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
//
// Sofern nicht durch anwendbare Rechtsvorschriften
// gefordert oder in schriftlicher Form vereinbart, wird
// die unter der Lizenz verbreitete Software "so wie sie
// ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
// ausdrücklich oder stillschweigend - verbreitet.
// Die sprachspezifischen Genehmigungen und Beschränkungen
// unter der Lizenz sind dem Lizenztext zu entnehmen.
//

package server

import (
	pb "antragsraum-proxy/gen/go"
	"antragsraum-proxy/internal/config"
	"antragsraum-proxy/internal/mock"
	"context"
	"github.com/stretchr/testify/assert"
	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials/insecure"
	"google.golang.org/grpc/metadata"
	"net"
	"testing"
	"time"
)

func TestStartGrpcRouter(t *testing.T) {
	setUpGrpcRouterEnv := func() (pb.AntragraumServiceClient, func()) {
		mock.SetUpGrpcServer()
		SetUpGrpcRouter()

		conn, err := grpc.NewClient("localhost:50051", grpc.WithTransportCredentials(insecure.NewCredentials()))
		assert.NoError(t, err)

		cleanUp := func() {
			conn.Close()
		}
		client := pb.NewAntragraumServiceClient(conn)

		return client, cleanUp
	}

	t.Run("should start gRPC router", func(t *testing.T) {
		SetUpGrpcRouter()

		conn, err := net.DialTimeout("tcp", "localhost:50051", 2*time.Second)

		assert.NoError(t, err)

		conn.Close()
	})

	t.Run("should have no error", func(t *testing.T) {
		client, cleanUp := setUpGrpcRouterEnv()
		defer cleanUp()

		md := metadata.New(map[string]string{GrpcAddressMetadata: "localhost"})
		ctx := metadata.NewOutgoingContext(context.Background(), md)
		resp, err := client.FindRueckfragen(ctx, &pb.GrpcFindRueckfragenRequest{PostfachId: "testPostfachId"})

		assert.NoError(t, err)
		assert.NotNil(t, resp)
	})

	t.Run("should have error", func(t *testing.T) {
		client, cleanUp := setUpGrpcRouterEnv()
		defer cleanUp()

		md := metadata.New(map[string]string{GrpcAddressMetadata: "localhost"})
		ctx := metadata.NewOutgoingContext(context.Background(), md)
		resp, err := client.FindRueckfragen(ctx, &pb.GrpcFindRueckfragenRequest{})

		assert.Error(t, err)
		assert.Contains(t, err.Error(), "Id is missing")
		assert.Nil(t, resp)
	})
}

func TestGetGrpcServerUrl(t *testing.T) {
	c := config.Config{}
	c.Grpc.Server.Port = 1234

	result := GetGrpcServerUrl("localhost", c)

	assert.Equal(t, "localhost:1234", result)
}