package value_objects

import (
	"github.com/google/uuid"
)

// AccountID represents a unique account identifier
type AccountID struct {
	value uuid.UUID
}

// NewAccountID creates a new AccountID
func NewAccountID() AccountID {
	return AccountID{value: uuid.New()}
}

// AccountIDFromString creates an AccountID from a string
func AccountIDFromString(s string) (AccountID, error) {
	id, err := uuid.Parse(s)
	if err != nil {
		return AccountID{}, err
	}
	return AccountID{value: id}, nil
}

// AccountIDFromUUID creates an AccountID from a UUID
func AccountIDFromUUID(id uuid.UUID) AccountID {
	return AccountID{value: id}
}

// String returns the string representation
func (id AccountID) String() string {
	return id.value.String()
}

// UUID returns the UUID value
func (id AccountID) UUID() uuid.UUID {
	return id.value
}

// IsZero checks if the AccountID is zero
func (id AccountID) IsZero() bool {
	return id.value == uuid.Nil
}

// Equals checks if two AccountIDs are equal
func (id AccountID) Equals(other AccountID) bool {
	return id.value == other.value
}

// MarshalJSON implements json.Marshaler interface
func (id AccountID) MarshalJSON() ([]byte, error) {
	return []byte(`"` + id.value.String() + `"`), nil
}

// UnmarshalJSON implements json.Unmarshaler interface
func (id *AccountID) UnmarshalJSON(data []byte) error {
	// Remove quotes
	str := string(data)
	if len(str) >= 2 && str[0] == '"' && str[len(str)-1] == '"' {
		str = str[1 : len(str)-1]
	}

	parsed, err := uuid.Parse(str)
	if err != nil {
		return err
	}
	id.value = parsed
	return nil
}
