using System.Net;

using HttpClientStudy.Model;
using HttpClientStudy.Service;

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

namespace HttpClientStudy.WebApp.Controllers
{
    /// <summary>
    /// 普通(简单) 控制器
    /// </summary>
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class NormalController : ControllerBase
    {
        private ILogger<SimpleController> _logger;
        private AccountService _accountService;

        /// <summary>
        /// 构造
        /// </summary>
        public NormalController(ILogger<SimpleController> logger, AccountService accountService)
        { 
            _logger = logger;
            _accountService = accountService;
        }

        /// <summary>
        /// 获取所有账号
        /// (无参数)
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public IActionResult GetAllAccounts()
        {
            var accounts = _accountService.GetAllAccounts();

            var result = BaseResultUtil.Success(accounts);
            return Ok(result);
        }

        /// <summary>
        /// 查询账号
        /// (默认方式参数:URL传参)
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public IActionResult GetAccount(int id)
        {
            var accounts = _accountService.GetAllAccounts();
            var account = accounts.FirstOrDefault(a => a.Id == id);

            var result = BaseResultUtil.Success(account);
            return Ok(result);
        }

        /// <summary>
        /// 查询账号
        /// (路由参数)
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        [Route("{name}")]
        public IActionResult GetAccount([FromRoute] string name)
        {
            var accounts = _accountService.GetAllAccounts();
            var account = accounts.FirstOrDefault(a => a.Name == name);
            var result = BaseResultUtil.Success(account);
            return Ok(result);
        }

        /// <summary>
        /// 查询账号
        /// (中文参数)
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public IActionResult GetAccountByName(string ChineseName, [FromQuery]string ChineseName2)
        {
            var accounts = _accountService
                .GetAllAccounts()
                .Where(a => a.Name == ChineseName || a.Name == ChineseName2)
                .ToList();

            var result = BaseResultUtil.Success(accounts);
            return Ok(result);
        }

        /// <summary>
        /// 查询账号
        /// (查询参数)
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public IActionResult GetAccountByRole([FromQuery] string role)
        {
            var accounts = _accountService.GetAllAccounts();

            accounts = accounts.Where(accounts => accounts.Role == role).ToList();

            var result = BaseResultUtil.Success(accounts);
            return Ok(result);
        }

        /// <summary>
        /// 查询账号
        /// (请求头参数:中文,客户端Url编码后请求,此处Url解码后使用)
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public IActionResult GetAccountFromHeader([FromHeader] string name)
        {
            //先Url解码
            var decodeName = WebUtility.UrlDecode(name);
            var account = _accountService.GetAllAccounts().Single(i => i.Name == decodeName);
            var result = BaseResultUtil.Success(account);
            return Ok(result);
        }

        /// <summary>
        /// 查询账号
        /// (服务注入参数)
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public IActionResult GetAccountFromServices([FromServices] Account account)
        {
            var result = BaseResultUtil.Success(account);
            return Ok(result);
        }

        /// <summary>
        /// Put请求 示例
        /// </summary>
        /// <returns></returns>
        [HttpPut]
        public IActionResult PutDemo(int id)
        {
            var accounts = _accountService.GetAllAccounts();
            var account = accounts.FirstOrDefault(a => a.Id == id);

            var result = BaseResultUtil.Success(account);
            return Ok(result);
        }

        /// <summary>
        /// Head请求 示例
        /// </summary>
        /// <returns></returns>
        [HttpHead]
        public IActionResult HeadDemo(int id)
        {
            var accounts = _accountService.GetAllAccounts();
            var account = accounts.FirstOrDefault(a => a.Id == id);

            var result = BaseResultUtil.Success(account);
            return Ok(result);
        }
    }
}