using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Persistence.Models;
using Persistence.Repositories;

namespace Persistence.API.Controllers;

[ApiController]
[Authorize]
[Route("api/[controller]")]
public class TimeSeriesController<TDto> : ControllerBase, ITimeSeriesDataApi<TDto>
   where TDto : class, ITimeSeriesAbstractDto, new()
{
    private ITimeSeriesDataRepository<TDto> timeSeriesDataRepository;

	public TimeSeriesController(ITimeSeriesDataRepository<TDto> timeSeriesDataRepository)
	{
		this.timeSeriesDataRepository = timeSeriesDataRepository;
    }

	/// <summary>
	/// Получить список объектов, удовлетворяющий диапазону дат
	/// </summary>
	/// <param name="dateBegin"></param>
	/// <param name="token"></param>
	/// <returns></returns>
	[HttpGet]
    [ProducesResponseType(StatusCodes.Status200OK)]
    public async Task<IActionResult> Get(DateTimeOffset dateBegin, CancellationToken token)
    {
        var result = await timeSeriesDataRepository.GetGtDate(dateBegin, token);
        return Ok(result);
    }

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

	/// <summary>
	/// Получить список объектов с прореживанием, удовлетворяющий диапазону дат
	/// </summary>
	/// <param name="dateBegin"></param>
	/// <param name="intervalSec"></param>
	/// <param name="approxPointsCount"></param>
	/// <param name="token"></param>
	/// <returns></returns>
	[HttpGet("resampled")]
    public async Task<IActionResult> GetResampledData(DateTimeOffset dateBegin, double intervalSec = 600d, int approxPointsCount = 1024, CancellationToken token = default)
    {
        var result = await timeSeriesDataRepository.GetResampledData(dateBegin, intervalSec, approxPointsCount, token);
        return Ok(result);
    }

	/// <summary>
	/// Добавить записи
	/// </summary>
	/// <param name="dtos"></param>
	/// <param name="token"></param>
	/// <returns></returns>
	[HttpPost]
    public async Task<IActionResult> AddRange(IEnumerable<TDto> dtos, CancellationToken token)
    {
        var result = await timeSeriesDataRepository.AddRange(dtos, token);
        return Ok(result);
    }


}