using AsbCloudApp.Data.SAUB;
using AsbCloudApp.Services;
using AsbCloudWebApi.SignalR;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.SignalR;
using System.Threading.Tasks;
using System.Threading;
using System;
using Microsoft.AspNetCore.Http;

namespace AsbCloudWebApi.Controllers.SAUB
{
    /// <summary>
    /// Данные АКБ
    /// </summary>
    [Route("api/[controller]")]
    [ApiController]
    public class TelemetryDataSaubController : TelemetryDataBaseController<TelemetryDataSaubDto>
    {
        private readonly ITelemetryDataSaubService telemetryDataSaubService;

        public TelemetryDataSaubController(
            ITelemetryService telemetryService,
            ITelemetryDataSaubService telemetryDataService,
            IWellService wellService,
            IHubContext<TelemetryHub> telemetryHubContext)
            : base(
                  telemetryService,
                  telemetryDataService,
                  wellService,
                  telemetryHubContext)
        {
            SignalRMethodGetDataName = "ReceiveDataSaub";
            telemetryDataSaubService = telemetryDataService;
        }

        /// <summary>
        /// Выгрузка архива. Не более 3-х суток. Формат даты строгий.
        /// </summary>
        /// <param name="idWell">id скважины (из адресной строки)</param>
        /// <param name="beginDate">начало интервала в формате: yyyy-MM-DD HH:mm</param>
        /// <param name="endDate">конец интервала в формате: yyyy-MM-DD HH:mm</param>
        /// <param name="token"></param>
        /// <returns></returns>
        [HttpGet("{idWell}/export/csv")]
        [ProducesResponseType(typeof(PhysicalFileResult), (int)System.Net.HttpStatusCode.OK, "application/octet-stream")]
        [ProducesResponseType(StatusCodes.Status204NoContent)]
        public async Task<IActionResult> GetZippedCsv(int idWell, DateTime beginDate, DateTime endDate, CancellationToken token)
        {
            int? idCompany = User.GetCompanyId();

            if (idCompany is null)
                return Forbid();

            bool isCompanyOwnsWell = await wellService.IsCompanyInvolvedInWellAsync((int)idCompany,
                idWell, token).ConfigureAwait(false);

            if (!isCompanyOwnsWell)
                return Forbid();

            var stream = await telemetryDataSaubService.GetZippedCsv(idWell, beginDate, endDate, token).ConfigureAwait(false);
            var fileName = $"DataSaub idWell{idWell} {beginDate:yyyy-MM-DDTHH-mm} - {endDate:yyyy-MM-DDTHH-mm}.zip";
            return File(stream, "application/octet-stream", fileName);
        }
    }
}