using System.Text;

namespace View_by_Distance.Shared.Models.Stateless.Methods;

internal abstract class PersonName
{

    // ...

    internal static Models.PersonName Create(string name)
    {
        Models.PersonName result;
        Models.PersonNameLast personNameLast;
        Models.PersonNameAlias personNameAlias;
        Models.PersonNameFirst personNameFirst;
        Models.PersonNameMiddle personNameMiddle;
        string[] segments = name.Split(' ');
        if (segments.Length == 1)
        {
            personNameFirst = new(string.Empty);
            personNameLast = new(string.Empty);
            personNameMiddle = new(string.Empty);
            personNameAlias = new(segments[0]);
        }
        else if (segments.Length == 2)
        {
            personNameFirst = new(segments[0]);
            personNameLast = new(segments[1]);
            personNameMiddle = new(string.Empty);
            personNameAlias = new(string.Empty);
        }
        else if (segments.Length == 3 && segments[2] is "Jr." or "Jr" or "Sr")
        {
            personNameFirst = new(segments[0]);
            personNameLast = new(segments[1]);
            personNameMiddle = new(string.Empty);
            personNameAlias = new(string.Join(' ', segments));
        }
        else
        {
            string[] comment = name.Split(new string[] { " (" }, StringSplitOptions.None);
            if (comment.Length == 1)
            {
                personNameFirst = new(segments[0]);
                personNameLast = new(segments[^1]);
                personNameMiddle = new(string.Empty);
                personNameAlias = new(string.Join(' ', segments));
            }
            else
            {
                segments = comment[0].Split(' ');
                personNameFirst = new(segments[0]);
                personNameLast = new(segments[^1]);
                personNameMiddle = new(string.Empty);
                personNameAlias = new(string.Concat(string.Join(' ', segments), " (", comment[1]));
            }
        }
        result = new(personNameFirst, personNameMiddle, personNameLast, personNameAlias);
        return result;
    }

    internal static string GetFullName(Models.PersonName personName)
    {
        StringBuilder result = new();
        if (personName.First is not null)
            _ = result.Append(personName.First.Value);
        if (personName.Middle is not null)
            _ = result.Append(' ').Append(personName.Middle.Value);
        if (personName.Last is not null)
            _ = result.Append(' ').Append(personName.Last.Value);
        return result.ToString();
    }

}