using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using AsbCloudApp.Data.WellOperation;
using AsbCloudApp.Repositories;
using AsbCloudApp.Requests;
using AsbCloudApp.Requests.ExportOptions;
using AsbCloudApp.Services;
using AsbCloudDb.Model;
using AsbCloudInfrastructure.Services.ExcelServices;
using AsbCloudInfrastructure.Services.ExcelServices.Templates;

namespace AsbCloudInfrastructure.Services.WellOperations;

public class WellOperationExport<TTemplate> : ExcelExportService<WellOperationDto, WellOperationExportRequest, TTemplate>
   where TTemplate : class, ITemplateParameters, new()
{
   private readonly IWellService wellService;
   private readonly IWellOperationRepository wellOperationRepository;

   public WellOperationExport(IWellOperationRepository wellOperationRepository,
      IWellService wellService)
   {
      this.wellOperationRepository = wellOperationRepository;
      this.wellService = wellService;
   }

   protected override async Task<string> BuildFileNameAsync(WellOperationExportRequest options, CancellationToken token)
   {
      var caption = await wellService.GetWellCaptionByIdAsync(options.IdWell, token);

      return options.IdType switch
      {
         WellOperation.IdOperationTypeFact => $"{caption}_Фактические_операции.xlsx",
         WellOperation.IdOperationTypePlan => $"{caption}_Плановые_операции.xlsx",
         _ => throw new ArgumentOutOfRangeException(nameof(options.IdType))
      };
   }

   protected override Task<IEnumerable<WellOperationDto>> GetDtosAsync(WellOperationExportRequest options, CancellationToken token)
   {
      var request = new WellOperationRequest(new[] { options.IdWell })
      {
         OperationType = options.IdType,
      };
      
      return wellOperationRepository.GetAsync(request, token);
   }
}