package deliberi

import (
	"slices"
	"testing"

	comatproto "github.com/bluesky-social/indigo/api/atproto"
	deldb "tangled.org/core/deliberi/db"
	models "tangled.org/core/deliberi/models"
	"tangled.org/core/jetstream"
)

type kvDeletes struct{ keys []string }

func (k *kvDeletes) PutEmailDid(string, string)     {}
func (k *kvDeletes) SetPrimaryEmail(string, string) {}
func (k *kvDeletes) DeleteEmailKey(email string)    { k.keys = append(k.keys, email) }
func (k *kvDeletes) DeletePrimaryEmail(did string)  { k.keys = append(k.keys, "__primary:"+did) }

func accountFrame(did string, active bool, status string) *jetstream.Event {
	frameClock++
	acct := &comatproto.SyncSubscribeRepos_Account{Did: did, Active: active}
	if status != "" {
		acct.Status = &status
	}
	return &jetstream.Event{Did: did, TimeUS: frameClock, Kind: jetstream.EventKindAccount, Account: acct}
}

func TestAccountDeletionDropsEmails(t *testing.T) {
	const gone, kept = "did:plc:gone", "did:plc:kept"
	i := newTestIngester(t, fakeBobbin{})
	rec := &kvDeletes{}
	i.emailKV = rec
	for _, e := range []models.Email{
		{Did: gone, Address: "gone@example.com", Verified: true, Primary: true},
		{Did: gone, Address: "alt@example.com", Verified: true},
		{Did: kept, Address: "kept@example.com", Verified: true, Primary: true},
	} {
		if err := deldb.AddEmail(i.db, e); err != nil {
			t.Fatal(err)
		}
	}

	mustProcess(t, i,
		accountFrame(gone, false, "deactivated"),
		accountFrame(kept, false, "takendown"),
	)
	if len(rec.keys) != 0 {
		t.Fatalf("reversible statuses touched KV: %v", rec.keys)
	}

	mustProcess(t, i, accountFrame(gone, false, "deleted"))

	if left, _ := deldb.GetAllEmails(i.db, gone); len(left) != 0 {
		t.Errorf("deleted account still has emails: %v", left)
	}
	if left, _ := deldb.GetAllEmails(i.db, kept); len(left) != 1 {
		t.Errorf("other account lost emails: %v", left)
	}
	slices.Sort(rec.keys)
	want := []string{"__primary:" + gone, "alt@example.com", "gone@example.com"}
	if !slices.Equal(rec.keys, want) {
		t.Errorf("KV deletes = %v, want %v", rec.keys, want)
	}
}
