// 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 timelineNoteID = "6aa0d6e8-3b07-40a2-ae46-1bc272a0f472"

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

	server, capture := newPOSTServer(t, "/person_timeline_notes", timelineNoteResponseBody)
	defer server.Close()

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

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

	note, err := client.NewTimelineNote(personID).
		OnDate(noteDate).
		WithContent("Today we talked about ...").
		Create(ctx())
	if err != nil {
		t.Fatalf("error = %v", err)
	}

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

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

	assertBodyField(t, capture.Body, "person_id", personID)
	assertBodyField(t, capture.Body, "date_on", "2021-01-10")
	assertBodyField(t, capture.Body, "content", "Today we talked about ...")
}

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

	server, capture := newPOSTServer(t, "/person_timeline_notes", timelineNoteResponseBody)
	defer server.Close()

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

	// Per docs: date_on is optional (defaults to today), content is optional
	_, err := client.NewTimelineNote(personID).
		Create(ctx())
	if err != nil {
		t.Fatalf("error = %v", err)
	}

	assertBodyField(t, capture.Body, "person_id", personID)
}

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

	testErrorCases(t, func(c *lunatask.Client) error {
		_, err := c.NewTimelineNote(personID).Create(ctx())

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

const timelineNoteResponseBody = `{
	"person_timeline_note": {
		"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"
	}
}`
