package storage

import (
	"testing"
	"time"
)

func TestTextEmailInserts(t *testing.T) {
	setup()
	defer Close()

	t.Log("Testing text email storage")

	start := time.Now()

	assertEqualStats(t, 0, 0)

	for i := 0; i < testRuns; i++ {
		if _, err := Store(testTextEmail); err != nil {
			t.Log("error ", err)
			t.Fail()
		}
	}

	assertEqual(t, CountTotal(), testRuns, "Incorrect number of text emails stored")

	t.Logf("Inserted %d text emails in %s", testRuns, time.Since(start))

	assertEqualStats(t, testRuns, testRuns)

	delStart := time.Now()
	if err := DeleteAllMessages(); err != nil {
		t.Log("error ", err)
		t.Fail()
	}

	assertEqual(t, CountTotal(), 0, "incorrect number of text emails deleted")

	t.Logf("deleted %d text emails in %s", testRuns, time.Since(delStart))

	assertEqualStats(t, 0, 0)
}

func TestMimeEmailInserts(t *testing.T) {
	setup()
	defer Close()

	t.Log("Testing mime email storage")

	start := time.Now()

	for i := 0; i < testRuns; i++ {
		if _, err := Store(testMimeEmail); err != nil {
			t.Log("error ", err)
			t.Fail()
		}
	}

	assertEqual(t, CountTotal(), testRuns, "Incorrect number of mime emails stored")

	t.Logf("Inserted %d text emails in %s", testRuns, time.Since(start))

	assertEqualStats(t, testRuns, testRuns)

	delStart := time.Now()
	if err := DeleteAllMessages(); err != nil {
		t.Log("error ", err)
		t.Fail()
	}

	assertEqual(t, CountTotal(), 0, "incorrect number of mime emails deleted")

	t.Logf("Deleted %d mime emails in %s", testRuns, time.Since(delStart))
}

func TestRetrieveMimeEmail(t *testing.T) {
	setup()
	defer Close()

	t.Log("Testing mime email retrieval")

	id, err := Store(testMimeEmail)
	if err != nil {
		t.Log("error ", err)
		t.Fail()
	}

	msg, err := GetMessage(id)
	if err != nil {
		t.Log("error ", err)
		t.Fail()
	}

	assertEqual(t, msg.From.Name, "Sender Smith", "\"From\" name does not match")
	assertEqual(t, msg.From.Address, "sender2@example.com", "\"From\" address does not match")
	assertEqual(t, msg.Subject, "inline + attachment", "subject does not match")
	assertEqual(t, len(msg.To), 1, "incorrect number of recipients")
	assertEqual(t, msg.To[0].Name, "Recipient Ross", "\"To\" name does not match")
	assertEqual(t, msg.To[0].Address, "recipient2@example.com", "\"To\" address does not match")
	assertEqual(t, len(msg.Attachments), 1, "incorrect number of attachments")
	assertEqual(t, msg.Attachments[0].FileName, "Sample PDF.pdf", "attachment filename does not match")
	assertEqual(t, len(msg.Inline), 1, "incorrect number of inline attachments")
	assertEqual(t, msg.Inline[0].FileName, "inline-image.jpg", "inline attachment filename does not match")

	attachmentData, err := GetAttachmentPart(id, msg.Attachments[0].PartID)
	if err != nil {
		t.Log("error ", err)
		t.Fail()
	}
	assertEqual(t, len(attachmentData.Content), msg.Attachments[0].Size, "attachment size does not match")

	inlineData, err := GetAttachmentPart(id, msg.Inline[0].PartID)
	if err != nil {
		t.Log("error ", err)
		t.Fail()
	}
	assertEqual(t, len(inlineData.Content), msg.Inline[0].Size, "inline attachment size does not match")
}

func BenchmarkImportText(b *testing.B) {
	setup()
	defer Close()

	for i := 0; i < b.N; i++ {
		if _, err := Store(testTextEmail); err != nil {
			b.Log("error ", err)
			b.Fail()
		}
	}
}

func BenchmarkImportMime(b *testing.B) {
	setup()
	defer Close()

	for i := 0; i < b.N; i++ {
		if _, err := Store(testMimeEmail); err != nil {
			b.Log("error ", err)
			b.Fail()
		}
	}

}