package telegram

import (
	"context"
	"testing"
	"time"

	"github.com/cenkalti/backoff/v4"
	"github.com/stretchr/testify/require"
	"go.uber.org/zap"

	"go.mau.fi/mautrix-telegram/pkg/gotd/bin"
	"go.mau.fi/mautrix-telegram/pkg/gotd/exchange"
)

type fingerprintNotFoundConn struct{}

func (m fingerprintNotFoundConn) Run(context.Context) error {
	return exchange.ErrKeyFingerprintNotFound
}

func (m fingerprintNotFoundConn) Invoke(context.Context, bin.Encoder, bin.Decoder) error {
	return nil
}

func (m fingerprintNotFoundConn) Ping(context.Context) error {
	return nil
}

func (m fingerprintNotFoundConn) Ready() <-chan struct{} {
	return nil
}

func TestClient_reconnectUntilClosed(t *testing.T) {
	client := Client{
		newConnBackoff: func() backoff.BackOff {
			return backoff.NewConstantBackOff(time.Nanosecond)
		},
		log: zap.NewNop(),
	}
	client.init()
	client.conn = fingerprintNotFoundConn{}

	ctx := context.Background()
	require.ErrorIs(t, client.reconnectUntilClosed(ctx), exchange.ErrKeyFingerprintNotFound)
}
