// SPDX-FileCopyrightText: Amolith <amolith@secluded.site>
//
// SPDX-License-Identifier: AGPL-3.0-or-later

package lunatask_test

import (
	"testing"
	"time"

	lunatask "git.secluded.site/go-lunatask"
)

const journalEntryID = "6aa0d6e8-3b07-40a2-ae46-1bc272a0f472"

func TestCreateJournalEntry_Success(t *testing.T) {
	t.Parallel()

	server, capture := newPOSTServer(t, "/journal_entries", journalEntryResponseBody)
	defer server.Close()

	client := lunatask.NewClient(testToken, lunatask.BaseURL(server.URL))

	entryDate := lunatask.NewDate(time.Date(2021, 1, 10, 0, 0, 0, 0, time.UTC))

	entry, err := client.NewJournalEntry(entryDate).
		WithContent("Today was a tough day, but on the other side...").
		Create(ctx())
	if err != nil {
		t.Fatalf("error = %v", err)
	}

	if entry == nil {
		t.Fatal("returned nil")
	}

	if entry.ID != journalEntryID {
		t.Errorf("ID = %q, want %q", entry.ID, journalEntryID)
	}

	assertBodyField(t, capture.Body, "date_on", "2021-01-10")
	assertBodyField(t, capture.Body, "content", "Today was a tough day, but on the other side...")
}

func TestCreateJournalEntry_WithName(t *testing.T) {
	t.Parallel()

	server, capture := newPOSTServer(t, "/journal_entries", journalEntryResponseBody)
	defer server.Close()

	client := lunatask.NewClient(testToken, lunatask.BaseURL(server.URL))

	entryDate := lunatask.NewDate(time.Date(2021, 1, 10, 0, 0, 0, 0, time.UTC))

	_, err := client.NewJournalEntry(entryDate).
		WithName("Custom Title").
		WithContent("Some content").
		Create(ctx())
	if err != nil {
		t.Fatalf("error = %v", err)
	}

	assertBodyField(t, capture.Body, "date_on", "2021-01-10")
	assertBodyField(t, capture.Body, "name", "Custom Title")
	assertBodyField(t, capture.Body, "content", "Some content")
}

func TestCreateJournalEntry_Errors(t *testing.T) {
	t.Parallel()

	testErrorCases(t, func(c *lunatask.Client) error {
		entryDate := lunatask.NewDate(time.Date(2021, 1, 10, 0, 0, 0, 0, time.UTC))
		_, err := c.NewJournalEntry(entryDate).Create(ctx())

		return err //nolint:wrapcheck // test helper
	})
}

const journalEntryResponseBody = `{
	"journal_entry": {
		"id": "6aa0d6e8-3b07-40a2-ae46-1bc272a0f472",
		"date_on": "2021-01-10",
		"created_at": "2021-01-10T10:39:25Z",
		"updated_at": "2021-01-10T10:39:25Z"
	}
}`
