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

package lunatask

import (
	"errors"
	"fmt"
	"strings"
)

// RelationshipStrength categorizes the closeness of a relationship.
type RelationshipStrength string

// Valid relationship strength values.
const (
	RelationshipFamily         RelationshipStrength = "family"
	RelationshipIntimateFriend RelationshipStrength = "intimate-friends"
	RelationshipCloseFriend    RelationshipStrength = "close-friends"
	// RelationshipCasualFriend is the default if not specified.
	RelationshipCasualFriend   RelationshipStrength = "casual-friends"
	RelationshipAcquaintance   RelationshipStrength = "acquaintances"
	RelationshipBusiness       RelationshipStrength = "business-contacts"
	RelationshipAlmostStranger RelationshipStrength = "almost-strangers"
)

// Errors returned by RelationshipStrength operations.
var (
	// ErrInvalidRelationshipStrength is returned when parsing an unknown relationship strength string.
	ErrInvalidRelationshipStrength = errors.New("invalid relationship strength")
)

// String returns the relationship strength value as a string.
func (r RelationshipStrength) String() string {
	return string(r)
}

// AllRelationshipStrengths returns all valid relationship strength values
// from closest (family) to most distant (almost strangers).
func AllRelationshipStrengths() []RelationshipStrength {
	return []RelationshipStrength{
		RelationshipFamily,
		RelationshipIntimateFriend,
		RelationshipCloseFriend,
		RelationshipCasualFriend,
		RelationshipAcquaintance,
		RelationshipBusiness,
		RelationshipAlmostStranger,
	}
}

// ParseRelationshipStrength parses a string to a RelationshipStrength value (case-insensitive).
// Valid values: "family", "intimate-friends", "close-friends", "casual-friends",
// "acquaintances", "business-contacts", "almost-strangers".
func ParseRelationshipStrength(str string) (RelationshipStrength, error) {
	switch strings.ToLower(str) {
	case "family":
		return RelationshipFamily, nil
	case "intimate-friends":
		return RelationshipIntimateFriend, nil
	case "close-friends":
		return RelationshipCloseFriend, nil
	case "casual-friends":
		return RelationshipCasualFriend, nil
	case "acquaintances":
		return RelationshipAcquaintance, nil
	case "business-contacts":
		return RelationshipBusiness, nil
	case "almost-strangers":
		return RelationshipAlmostStranger, nil
	default:
		return "", fmt.Errorf("%w: %q", ErrInvalidRelationshipStrength, str)
	}
}
