using AsbCloudApp.Data.Trajectory;
using AsbCloudApp.Repositories;
using AsbCloudApp.Services;
using AsbCloudInfrastructure.Services.Trajectory;
using AsbCloudInfrastructure.Services.Trajectory.Export;
using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using AsbCloudInfrastructure.Services;

namespace AsbCloudWebApi.Controllers.Trajectory
{
	/// <summary>
	/// Плановая траектория (загрузка и хранение)
	/// </summary>
	[Route("api/well/{idWell}/[controller]")]
	[ApiController]
	public class TrajectoryPlanController : TrajectoryEditableController<TrajectoryGeoPlanDto>
	{
		private readonly TrajectoryService trajectoryVisualizationService;

		protected override string fileName => "ЕЦП_шаблон_файла_плановая_траектория.xlsx";

		public TrajectoryPlanController(IWellService wellService,
			TrajectoryPlanExportService trajectoryExportService,
			ParserServiceFactory parserServiceFactory,
			ITrajectoryEditableRepository<TrajectoryGeoPlanDto> trajectoryRepository,
			TrajectoryService trajectoryVisualizationService)
			: base(wellService,
				parserServiceFactory,
				trajectoryExportService,
				trajectoryRepository,
				ParserServiceFactory.IdTrajectoryPlanParser)
		{
			this.trajectoryVisualizationService = trajectoryVisualizationService;
		}

		/// <summary>
		/// Получение координат для визуализации траектории (плановой и фактической)
		/// </summary>
		/// <param name="idWell"></param>
		/// <param name="token"></param>
		/// <returns></returns>
		[HttpGet("trajectoryCartesianPlanFact")]
		[ProducesResponseType(
			typeof(TrajectoryPlanFactDto<IEnumerable<TrajectoryCartesianPlanDto>, IEnumerable<TrajectoryCartesianFactDto>>),
			(int)System.Net.HttpStatusCode.OK)]
		public async Task<IActionResult> GetTrajectoryCartesianPlanFactAsync(int idWell, CancellationToken token)
		{
			if (!await CanUserAccessToWellAsync(idWell,
					token).ConfigureAwait(false))
				return Forbid();

			var result = await trajectoryVisualizationService.GetTrajectoryCartesianAsync(idWell, token);
			return Ok(result);
		}
	}
}