using AsbCloudApp.Data;
using AsbCloudApp.Requests;
using AsbCloudApp.Services;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;

namespace AsbCloudWebApi.Controllers;

/// <summary>
/// Справочник бурильщиков
/// </summary>
[Route("api/driller")]
[ApiController]
[Authorize]
public class DrillerController : CrudController<DrillerDto, ICrudRepository<DrillerDto>>
{
    private IScheduleRepository scheduleRepository;

    public DrillerController(ICrudRepository<DrillerDto> service, IScheduleRepository scheduleRepository)
        : base(service)
    {
        this.scheduleRepository = scheduleRepository;
    }

    /// <summary>
    /// Получить список бурильщиков по ключам скважин
    /// </summary>
    /// <param name="idsWells">массив ключей скважин</param>
    /// <param name="token">token</param>
    /// <returns>все записи</returns>
    [HttpGet("/api/drillers")]
    [Permission]
    [ProducesResponseType(typeof(IEnumerable<DrillerDto>), StatusCodes.Status200OK)]
    public async Task<IActionResult> GetAsync([FromQuery] IEnumerable<int> idsWells, CancellationToken token)
    {
        var request = new GetStatRequest()
        {
            IdsWells = idsWells,
        };
        var schedulePage = await scheduleRepository.GetPageAsync(request, token);
        var drillers = schedulePage
            .Select(s => s.Driller)
            .Where(d => d is not null)
            .GroupBy(d => d!.Id)
            .Select(group => group.First())
            .OrderBy(d => d!.Surname);

        return Ok(drillers);
    }
}