using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;

namespace AsbCloudWebApi.Controllers
{
    /// <summary>
    /// Имитирует разные типы ответа сервера
    /// </summary>
    [Route("api/[controller]")]
    [ApiController]
    public class MockController : ControllerBase
    {
        /// <summary>
        /// имитирует http-400
        /// </summary>
        [HttpGet("400")]
        [ProducesResponseType(typeof(ValidationProblemDetails), (int)System.Net.HttpStatusCode.BadRequest)]
        public IActionResult Get400([FromQuery, Required]IDictionary<string, string> args)
        {
            var errors = new Dictionary<string, string[]>();
            
            foreach (var arg in args)
            {
                var countOfErrors = ((arg.Key + arg.Value).Length % 3) + 1;
                var errorsText = Enumerable.Range(0, countOfErrors)
                    .Select(i => $"{arg.Value} не соответствует критериям проверки № {i}");

                errors.Add(arg.Key, errorsText.ToArray());                
            }

            if (errors.Any())
            {
                var problem = new ValidationProblemDetails(errors);                
                return BadRequest(problem);
            }
            else
            {
                var problem = new ValidationProblemDetails { Detail = "at least one argument must be provided" };
                return BadRequest(problem);
            }
        }

        /// <summary>
        /// имитирует http-403
        /// </summary>
        [HttpGet("403")]
        public IActionResult Get403()
        {
            return Forbid();
        }

        /// <summary>
        /// имитирует http-401
        /// </summary>
        [HttpGet("401")]
        public IActionResult Get401()
        {
            return Unauthorized();
        }

        /// <summary>
        /// имитирует http-500
        /// </summary>
        [HttpGet("500")]
        public IActionResult Get500()
        {
            throw new System.Exception("Это тестовое исключение");
        }
    }
}