using System.Collections.Concurrent;

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;

namespace HttpClientStudy.WebApp.Controllers
{
    /// <summary>
    /// Polly V8 控制器
    /// </summary>
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class Polly8Controller : ControllerBase
    {
        private static ConcurrentDictionary<string, bool> ToggleExceptionCache = new ConcurrentDictionary<string, bool>();

        private readonly ILogger<Polly8Controller> _logger;

        /// <summary>
        /// 构造
        /// </summary>
        /// <param name="logger">日志</param>
        public Polly8Controller(ILogger<Polly8Controller> logger)
        {
            _logger = logger;
        }

        /// <summary>
        /// Polly8Hello
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public ActionResult Hello()
        {
            return Ok("Polly v8");
        }

        /// <summary>
        /// 异常接口
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public ActionResult Exception()
        {
            throw new HttpRequestException("服务器异常");
        }

        /// <summary>
        /// 重试策略异常
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public ActionResult RetryException()
        {
            throw new HttpRequestException("服务器异常");
        }

        /// <summary>
        /// 随机异常
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public ActionResult RandomException()
        {
            var num = Random.Shared.Next(1, 100);
            if (num >= 50)
            {
                throw new HttpRequestException("服务器随机异常");
            }
            else
            {
                return Ok(num);
            }
        }

        /// <summary>
        /// 切换异常
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public ActionResult ToggleException(string toggleId = "")
        {
            var toggle = ToggleExceptionCache.GetOrAdd(toggleId, true);
            //保存切换
            ToggleExceptionCache[toggleId] = !toggle;

            if (toggle)
            {
                throw new HttpRequestException("服务器随机异常");
            }
            else
            {
                return Ok($"ToggleException toggleId={toggleId}");
            }
        }
    }
}