#nullable enable
using Baya.Application.Models.Common;
using Baya.Application.Models.Search;

namespace Baya.Application.Contracts.Search;

/// <summary>
/// The search-service seam. Discovery callers depend <b>only</b> on this interface — never on raw SQL or an
/// Elasticsearch client — so the MVP→Elastic swap is a registration/config change with no caller edits.
/// <para>
/// The MVP implementation (<c>SqlNurseSearch</c>) is the <b>real, production backend</b>, not a mock: it
/// reads the maintained <c>nurse_search_index</c> where <c>is_searchable = 1</c>, applies the
/// category/city/district/gender/price filters and the rating sort, and paginates. A later
/// <c>ElasticNurseSearch</c> is a config-selected drop-in; the SQL index stays the projection/fallback.
/// </para>
/// </summary>
public interface INurseSearch
{
    Task<PagedResult<NurseSearchResultDto>> SearchAsync(NurseSearchCriteria criteria, CancellationToken cancellationToken);
}
