package imapserver

import (
	"testing"

	"github.com/mjl-/mox/imapclient"
)

func TestDelete(t *testing.T) {
	tc := start(t)
	defer tc.close()

	tc2 := startNoSwitchboard(t)
	defer tc2.close()

	tc3 := startNoSwitchboard(t)
	defer tc3.close()

	tc.client.Login("mjl@mox.example", "testtest")
	tc2.client.Login("mjl@mox.example", "testtest")
	tc3.client.Login("mjl@mox.example", "testtest")

	tc.transactf("bad", "delete")              // Missing mailbox.
	tc.transactf("no", "delete inbox")         // Cannot delete inbox.
	tc.transactf("no", "delete nonexistent")   // Cannot delete mailbox that does not exist.
	tc.transactf("no", `delete "nonexistent"`) // Again, with quoted string syntax.

	tc.client.Subscribe("x")
	tc.transactf("no", "delete x") // Subscription does not mean there is a mailbox that can be deleted.

	tc.client.Create("a/b")
	tc2.transactf("ok", "noop") // Drain changes.
	tc3.transactf("ok", "noop")

	// ../rfc/9051:2000
	tc.transactf("no", "delete a") // Still has child.
	tc.xcode("HASCHILDREN")

	tc3.client.Enable("IMAP4rev2") // For \NonExistent support.
	tc.transactf("ok", "delete a/b")
	tc2.transactf("ok", "noop")
	tc2.xuntagged() // No IMAP4rev2, no \NonExistent.
	tc3.transactf("ok", "noop")
	tc3.xuntagged(imapclient.UntaggedList{Flags: []string{`\NonExistent`}, Separator: '/', Mailbox: "a/b"})

	tc.transactf("no", "delete a/b") // Already removed.
	tc.transactf("ok", "delete a")   // Parent can now be removed.
	tc.transactf("ok", `list (subscribed) "" (a/b a) return (subscribed)`)
	// Subscriptions still exist.
	tc.xuntagged(
		imapclient.UntaggedList{Flags: []string{`\Subscribed`, `\NonExistent`}, Separator: '/', Mailbox: "a"},
		imapclient.UntaggedList{Flags: []string{`\Subscribed`, `\NonExistent`}, Separator: '/', Mailbox: "a/b"},
	)

	// Let's try again with a message present.
	tc.client.Create("msgs")
	tc.client.Append("msgs", nil, nil, []byte(exampleMsg))
	tc.transactf("ok", "delete msgs")

	// Delete for inbox/* is allowed.
	tc.client.Create("inbox/a")
	tc.transactf("ok", "delete inbox/a")

}
