package participants

import (
	"testing"

	"github.com/stretchr/testify/require"

	"go.mau.fi/mautrix-telegram/pkg/gotd/telegram/message/peer"
	"go.mau.fi/mautrix-telegram/pkg/gotd/tg"
)

func TestElem(t *testing.T) {
	entities := peer.NewEntities(
		map[int64]*tg.User{10: {}},
		map[int64]*tg.Chat{},
		map[int64]*tg.Channel{},
	)

	type results struct {
		admin, creator, photos bool
	}
	tests := []struct {
		Name string
		Part tg.ChannelParticipantClass
		results
	}{
		{"UnknownPlain", &tg.ChannelParticipant{UserID: 45}, results{}},
		{"UnknownBanned", &tg.ChannelParticipantBanned{Peer: &tg.PeerUser{UserID: 45}},
			results{}},
		{"UnknownAdmin", &tg.ChannelParticipantAdmin{UserID: 45}, results{}},
		{"UnknownCreator", &tg.ChannelParticipantCreator{UserID: 45}, results{}},
		{"Plain", &tg.ChannelParticipant{UserID: 10}, results{photos: true}},
		{"Banned", &tg.ChannelParticipantBanned{Peer: &tg.PeerUser{UserID: 10}},
			results{photos: true}},
		{"Admin", &tg.ChannelParticipantAdmin{UserID: 10}, results{
			admin:  true,
			photos: true,
		}},
		{"Creator", &tg.ChannelParticipantCreator{UserID: 10}, results{
			creator: true,
			photos:  true,
		}},
	}
	for _, test := range tests {
		t.Run(test.Name, func(t *testing.T) {
			a := require.New(t)
			var ok bool

			elem := Elem{Participant: test.Part, Entities: entities}
			_, ok = elem.UserPhotos(nil)
			a.Equal(test.photos, ok)
			_, _, ok = elem.Admin()
			a.Equal(test.admin, ok)
			_, _, ok = elem.Creator()
			a.Equal(test.creator, ok)
		})
	}
}
