using AsbCloudApp.Data;
using AsbCloudApp.Services;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;

namespace AsbCloudWebApi.Controllers
{
    /// <summary>
    /// Инфо о месторождениях
    /// </summary>
    [Route("api/deposit")]
    [ApiController]
    [Authorize]
    public class DepositController : ControllerBase
    {
        private readonly IClusterService clusterService;

        public DepositController(IClusterService clusterService)
        {
            this.clusterService = clusterService;
        }

        /// <summary>
        /// Получает список доступных пользователю месторождений
        /// </summary>
        /// <param name="token"> Токен отмены задачи </param>
        /// <returns></returns>
        [HttpGet]
        [Permission]
        [ProducesResponseType(typeof(IEnumerable<DepositDto>), (int)System.Net.HttpStatusCode.OK)]
        public async Task<IActionResult> GetDepositsAsync(CancellationToken token = default)
        {
            int? idCompany = User.GetCompanyId();

            if (idCompany is null)
                return Forbid();

            var result = await clusterService.GetDepositsAsync((int)idCompany,
                token).ConfigureAwait(false);
            return Ok(result);
        }

        /// <summary>
        /// Получает список доступных пользователю месторождений (только скважины с параметрами бурения) 
        /// </summary>
        /// <param name="token"> Токен отмены задачи </param>
        /// <returns></returns>
        [HttpGet("drillParamsWells")]
        [Permission]
        [ProducesResponseType(typeof(IEnumerable<DepositDto>), (int)System.Net.HttpStatusCode.OK)]
        public async Task<IActionResult> GetDepositsDrillParamsAsync(CancellationToken token = default)
        {
            int? idCompany = User.GetCompanyId();

            if (idCompany is null)
                return Forbid();

            var result = await clusterService.GetDepositsDrillParamsAsync((int)idCompany,
                token).ConfigureAwait(false);
            return Ok(result);
        }

        /// <summary>
        /// Получает список доступных пользователю кустов месторождения
        /// </summary>
        /// <param name="depositId"></param>
        /// <param name="token"> Токен отмены задачи </param> 
        /// <returns></returns>
        [HttpGet("{depositId}")]
        [Permission]
        [ProducesResponseType(typeof(IEnumerable<ClusterDto>), (int)System.Net.HttpStatusCode.OK)]
        public async Task<IActionResult> GetClustersAsync(int depositId,
            CancellationToken token = default)
        {
            int? idCompany = User.GetCompanyId();

            if (idCompany is null)
                return Forbid();

            var result = await clusterService.GetClustersAsync((int)idCompany,
                depositId, token).ConfigureAwait(false);
            return Ok(result);
        }

    }
}