#nullable enable
using System.ComponentModel.DataAnnotations;
using Asp.Versioning;
using Baya.Application.Features.Search.Queries.SearchNurses;
using Baya.Application.Models.Common;
using Baya.Application.Models.Search;
using Baya.WebFramework.Attributes;
using Baya.WebFramework.BaseController;
using Mediator;
using Microsoft.AspNetCore.Mvc;

namespace Baya.Web.Api.Controllers.V1;

/// <summary>
/// Public nurse discovery. Pre-auth (families browse before signing in) and covered by the per-IP global
/// rate limiter. Reads only searchable (verified + accepting + active) rows via the <c>INurseSearch</c> seam.
/// </summary>
[ApiVersion("1")]
[ApiController]
[Route("api/v{version:apiVersion}/[controller]")]
[Display(Description = "Public nurse search: category + city/district geo, same-gender filter, price range, rating sort")]
public sealed class SearchController(ISender sender) : BaseController
{
    [HttpGet("[action]")]
    [ProducesOkApiResponseType<PagedResult<NurseSearchResultDto>>]
    public async Task<IActionResult> Nurses(
        [FromQuery(Name = "service_category_id")] long serviceCategoryId,
        [FromQuery(Name = "city_id")] long cityId,
        [FromQuery(Name = "district_id")] long? districtId,
        [FromQuery(Name = "nurse_gender")] string? nurseGender,
        [FromQuery(Name = "min_price")] long? minPrice,
        [FromQuery(Name = "max_price")] long? maxPrice,
        [FromQuery(Name = "price_unit")] string? priceUnit,
        [FromQuery(Name = "page")] int page,
        [FromQuery(Name = "page_size")] int pageSize,
        CancellationToken cancellationToken)
        => OperationResult(await sender.Send(
            new SearchNursesQuery(
                serviceCategoryId, cityId, districtId, nurseGender, minPrice, maxPrice, priceUnit,
                page <= 0 ? 1 : page,
                pageSize <= 0 ? Application.Common.Pagination.DefaultPageSize : pageSize),
            cancellationToken));
}
