using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using DD.Persistence.Models;
using DD.Persistence.Services.Interfaces;
using System.Net;

namespace DD.Persistence.API.Controllers;

/// <summary>
/// Работа с параметрами Wits
/// </summary>
[ApiController]
[Authorize]
[Route("api/[controller]")]
public class WitsDataController : ControllerBase, IWitsDataApi
{
    private readonly IWitsDataService witsDataService;

    public WitsDataController(IWitsDataService witsDataService)
    {
        this.witsDataService = witsDataService;
    }

    /// <summary>
    /// Получить диапазон дат, для которых есть данные в репозитории
    /// </summary>
    /// <param name="discriminatorId"></param>
    /// <param name="token"></param>
    /// <returns></returns>
    [HttpGet("{discriminatorId}/datesRange")]
    public async Task<ActionResult<DatesRangeDto>> GetDatesRangeAsync([FromRoute] Guid discriminatorId, CancellationToken token)
    {
        var result = await witsDataService.GetDatesRangeAsync(discriminatorId, token);

        return result == null ? NoContent() : Ok(result);
    }

    /// <summary>
    /// Получить порцию записей, начиная с заданной даты 
    /// </summary>
    /// <param name="discriminatorId"></param>
    /// <param name="dateBegin"></param>
    /// <param name="take"></param>
    /// <param name="token"></param>
    /// <returns></returns>
    [HttpGet("{discriminatorId}/part")]
    public async Task<ActionResult<IEnumerable<WitsDataDto>>> GetPart([FromRoute] Guid discriminatorId, [FromQuery] DateTimeOffset dateBegin, [FromQuery] int take, CancellationToken token)
    {
        var result = await witsDataService.GetPart(discriminatorId, dateBegin, take, token);

        return Ok(result);
    }

    /// <summary>
    /// Получить набор параметров (Wits) для построения графика
    /// </summary>
    /// <param name="discriminatorId">Дискриминатор системы</param>
    /// <param name="dateFrom">Начало временного интервала</param>
    /// <param name="dateTo">Конец временного интервала</param>
    /// <param name="approxPointsCount">Количество точек</param>
    /// <param name="token"></param>
    /// <returns></returns>
    [HttpGet("{discriminatorId}/graph")]
    public async Task<ActionResult<IEnumerable<WitsDataDto>>> GetValuesForGraph([FromRoute] Guid discriminatorId,
        [FromQuery] DateTimeOffset dateFrom, [FromQuery] DateTimeOffset dateTo, [FromQuery] int approxPointsCount, CancellationToken token)
    {
        var result = await witsDataService.GetValuesForGraph(discriminatorId, dateFrom, dateTo, approxPointsCount, token);

        return Ok(result);
    }

    /// <summary>
    /// Сохранить набор параметров (Wits)
    /// </summary>
    /// <param name="dtos"></param>
    /// <param name="token"></param>
    /// <returns></returns>
    [HttpPost]
    [ProducesResponseType(typeof(int), (int)HttpStatusCode.Created)]
    public async Task<IActionResult> AddRange([FromBody] IEnumerable<WitsDataDto> dtos, CancellationToken token)
    {
        var result = await witsDataService.AddRange(dtos, token);

        return CreatedAtAction(nameof(AddRange), result);
    }
}