namespace AyCode.Core.Interfaces;

/// <summary>
/// Postai címmel és adóazonosítóval azonosított fél (cég vagy partner) — <b>általános</b>, alsó-rétegű szerződés.
/// Bárhol használható, ahol egy felet név + adószám + postai cím alapján kell egységesen kezelni (számlázás,
/// szállítás, hatósági bejelentés stb.). Több, eltérő rétegű típus is implementálhatja (egy domain-entitás és
/// egy konfig-objektum egyaránt), így a feldolgozó kód egyetlen interfészen dolgozhat, a konkrét típus ismerete nélkül.
/// </summary>
public interface ICompanyInfoBase
{
    string Name { get; }
    string? TaxId { get; }
    string CountryCode { get; }
    string PostalCode { get; }
    string City { get; }
    string Street { get; }

    /// <summary>A <see cref="PostalCode"/> + <see cref="City"/> + <see cref="Street"/> egy sorba fűzve (a nem üres részekből).</summary>
    string FullAddress { get; }
}

/// <summary>Közös <see cref="ICompanyInfoBase"/> segédműveletek — hogy a <c>FullAddress</c> logikája EGY helyen éljen.</summary>
public static class CompanyInfoBaseExtensions
{
    /// <summary>A <c>PostalCode</c> + <c>City</c> + <c>Street</c> összefűzése egy sorba (a nem üres részekből); üres → <c>null</c>.</summary>
    public static string? ComposeFullAddress(this ICompanyInfoBase company)
    {
        var joined = string.Join(" ", new[] { company.PostalCode, company.City, company.Street }.Where(p => !string.IsNullOrWhiteSpace(p))).Trim();
        return string.IsNullOrWhiteSpace(joined) ? null : joined;
    }
}
