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

package lunatask_test

import (
	"testing"

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

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

	strengths := lunatask.AllRelationshipStrengths()

	// Check count
	if got := len(strengths); got != 7 {
		t.Fatalf("AllRelationshipStrengths() returned %d values, want 7", got)
	}

	// Check order (closest to most distant)
	expected := []lunatask.RelationshipStrength{
		lunatask.RelationshipFamily,
		lunatask.RelationshipIntimateFriend,
		lunatask.RelationshipCloseFriend,
		lunatask.RelationshipCasualFriend,
		lunatask.RelationshipAcquaintance,
		lunatask.RelationshipBusiness,
		lunatask.RelationshipAlmostStranger,
	}
	for i, want := range expected {
		if strengths[i] != want {
			t.Errorf("AllRelationshipStrengths()[%d] = %q, want %q", i, strengths[i], want)
		}
	}

	// Check roundtrip: each value should be parseable
	for _, strength := range strengths {
		parsed, err := lunatask.ParseRelationshipStrength(strength.String())
		if err != nil {
			t.Errorf("ParseRelationshipStrength(%q) failed: %v", strength.String(), err)
		}

		if parsed != strength {
			t.Errorf("ParseRelationshipStrength(%q) = %q, want %q", strength.String(), parsed, strength)
		}
	}
}

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

	tests := []struct {
		name    string
		input   string
		want    lunatask.RelationshipStrength
		wantErr bool
	}{
		{"family_lower", "family", lunatask.RelationshipFamily, false},
		{"family_upper", "FAMILY", lunatask.RelationshipFamily, false},
		{"family_mixed", "FaMiLy", lunatask.RelationshipFamily, false},
		{"intimate_friends_lower", "intimate-friends", lunatask.RelationshipIntimateFriend, false},
		{"intimate_friends_upper", "INTIMATE-FRIENDS", lunatask.RelationshipIntimateFriend, false},
		{"close_friends_lower", "close-friends", lunatask.RelationshipCloseFriend, false},
		{"close_friends_upper", "CLOSE-FRIENDS", lunatask.RelationshipCloseFriend, false},
		{"casual_friends_lower", "casual-friends", lunatask.RelationshipCasualFriend, false},
		{"casual_friends_upper", "CASUAL-FRIENDS", lunatask.RelationshipCasualFriend, false},
		{"acquaintances_lower", "acquaintances", lunatask.RelationshipAcquaintance, false},
		{"acquaintances_upper", "ACQUAINTANCES", lunatask.RelationshipAcquaintance, false},
		{"business_contacts_lower", "business-contacts", lunatask.RelationshipBusiness, false},
		{"business_contacts_upper", "BUSINESS-CONTACTS", lunatask.RelationshipBusiness, false},
		{"almost_strangers_lower", "almost-strangers", lunatask.RelationshipAlmostStranger, false},
		{"almost_strangers_upper", "ALMOST-STRANGERS", lunatask.RelationshipAlmostStranger, false},
		{"almost_strangers_mixed", "Almost-Strangers", lunatask.RelationshipAlmostStranger, false},
		{"invalid", "invalid", "", true},
		{"empty", "", "", true},
		{"numeric", "1", "", true},
		{"typo", "famly", "", true},
		{"no_hyphen", "closefriends", "", true},
	}

	for _, testCase := range tests {
		t.Run(testCase.name, func(t *testing.T) {
			t.Parallel()

			got, err := lunatask.ParseRelationshipStrength(testCase.input)
			if (err != nil) != testCase.wantErr {
				t.Errorf("ParseRelationshipStrength(%q) error = %v, wantErr %v", testCase.input, err, testCase.wantErr)

				return
			}

			if !testCase.wantErr && got != testCase.want {
				t.Errorf("ParseRelationshipStrength(%q) = %q, want %q", testCase.input, got, testCase.want)
			}
		})
	}
}
