using System.Text;
using System.Text.Json;
using System.Text.Json.Serialization;

namespace View_by_Distance.Shared.Models;

public class Person : Properties.IPerson
{

    protected readonly PersonId _Id; // {-_-}SingletonClass
    protected readonly PersonBirthday _Birthday; // {-_-}SingletonClass
    protected readonly PersonName _Name; // {{_}}JsonValueKindObject
    protected readonly List<PersonComment> _Comments; // <{_}>PluralClass
    protected readonly List<PersonURL> _URLs; // <{_}>PluralClass
    protected readonly List<PersonNumber> _Numbers; // <{_}>PluralClass
    protected readonly List<PersonEmail> _Emails; // <{_}>PluralClass
    protected readonly List<PersonAddress> _Addresses; // <<_>>JsonValueKindArray

    public PersonId Id => _Id; // {-_-}SingletonClass
    public PersonBirthday Birthday => _Birthday; // {-_-}SingletonClass
    public PersonName Name => _Name; // {{_}}JsonValueKindObject
    public List<PersonComment> Comments => _Comments; // <{_}>PluralClass
    public List<PersonURL> URLs => _URLs; // <{_}>PluralClass
    public List<PersonNumber> Numbers => _Numbers; // <{_}>PluralClass
    public List<PersonEmail> Emails => _Emails; // <{_}>PluralClass
    public List<PersonAddress> Addresses => _Addresses; // <<_>>JsonValueKindArray

    [JsonConstructor]
    public Person
    (
        PersonId id,
        PersonBirthday birthday,
        PersonName name,
        List<PersonComment> comments,
        List<PersonURL> uRLs,
        List<PersonNumber> numbers,
        List<PersonEmail> emails,
        List<PersonAddress> addresses
    )
    {
        _Id = id; // {-_-}SingletonClass
        _Birthday = birthday; // {-_-}SingletonClass
        _Name = name; // {{_}}JsonValueKindObject
        _Comments = comments; // <{_}>PluralClass
        _URLs = uRLs; // <{_}>PluralClass
        _Numbers = numbers; // <{_}>PluralClass
        _Emails = emails; // <{_}>PluralClass
        _Addresses = addresses; // <<_>>JsonValueKindArray
    }

    public override string ToString()
    {
        string result = JsonSerializer.Serialize(this, new JsonSerializerOptions() { WriteIndented = true });
        return result;
    } // ...

    public string GetFullName()
    {
        StringBuilder result = new();
        if (_Name?.First is not null && !string.IsNullOrEmpty(_Name.First.Value))
            _ = result.Append(_Name.First.Value);
        if (_Name?.Middle is not null && !string.IsNullOrEmpty(_Name.Middle.Value))
            _ = result.Append(' ').Append(_Name.Middle.Value);
        if (_Name?.Last is not null && !string.IsNullOrEmpty(_Name.Last.Value))
            _ = result.Append(' ').Append(_Name.Last.Value);
        if (_Name?.Alias is not null && !string.IsNullOrEmpty(_Name.Alias.Value))
            _ = result.Append(" (").Append(_Name.Alias.Value).Append(')');
        return result.ToString();
    }

}