package store

import (
	"io"
	"os"
	"strings"
	"testing"

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

func TestMboxReader(t *testing.T) {
	createTemp := func(pattern string) (*os.File, error) {
		return os.CreateTemp("", pattern)
	}
	mboxf, err := os.Open("../testdata/importtest.mbox")
	if err != nil {
		t.Fatalf("open mbox: %v", err)
	}
	defer mboxf.Close()

	mr := NewMboxReader(createTemp, mboxf.Name(), mboxf, mlog.New("mboxreader"))
	_, mf0, _, err := mr.Next()
	if err != nil {
		t.Fatalf("next mbox message: %v", err)
	}
	defer mf0.Close()
	defer os.Remove(mf0.Name())

	_, mf1, _, err := mr.Next()
	if err != nil {
		t.Fatalf("next mbox message: %v", err)
	}
	defer mf1.Close()
	defer os.Remove(mf1.Name())

	_, _, _, err = mr.Next()
	if err != io.EOF {
		t.Fatalf("got err %v, expected eof for next mbox message", err)
	}
}

func TestMaildirReader(t *testing.T) {
	createTemp := func(pattern string) (*os.File, error) {
		return os.CreateTemp("", pattern)
	}
	// todo: rename 1642966915.1.mox to "1642966915.1.mox:2,"? cannot have that name in the git repo because go module (or the proxy) doesn't like it. could also add some flags and test they survive the import.
	newf, err := os.Open("../testdata/importtest.maildir/new")
	if err != nil {
		t.Fatalf("open maildir new: %v", err)
	}
	defer newf.Close()

	curf, err := os.Open("../testdata/importtest.maildir/cur")
	if err != nil {
		t.Fatalf("open maildir cur: %v", err)
	}
	defer curf.Close()

	mr := NewMaildirReader(createTemp, newf, curf, mlog.New("maildirreader"))
	_, mf0, _, err := mr.Next()
	if err != nil {
		t.Fatalf("next maildir message: %v", err)
	}
	defer mf0.Close()
	defer os.Remove(mf0.Name())

	_, mf1, _, err := mr.Next()
	if err != nil {
		t.Fatalf("next maildir message: %v", err)
	}
	defer mf1.Close()
	defer os.Remove(mf1.Name())

	_, _, _, err = mr.Next()
	if err != io.EOF {
		t.Fatalf("got err %v, expected eof for next maildir message", err)
	}
}

func TestParseDovecotKeywords(t *testing.T) {
	const data = `0 Old
1 Junk
2 NonJunk
3 $Forwarded
4 $Junk
`
	keywords, err := ParseDovecotKeywords(strings.NewReader(data), mlog.New("dovecotkeywords"))
	if err != nil {
		t.Fatalf("parsing dovecot-keywords: %v", err)
	}
	got := strings.Join(keywords, ",")
	want := "Old,Junk,NonJunk,$Forwarded,$Junk"
	if got != want {
		t.Fatalf("parsing dovecot keywords, got %q, want %q", got, want)

	}
}
