using BukiVedi.Shared.Apps;
using BukiVedi.Shared.Models;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;

namespace BukiVedi.App.Controllers
{
    [Route("api/author")]
    [ApiController]
    [Authorize("authorized")]
    public class AuthorsController
        : BaseController
    {
        private readonly IAuthorHandler _handler;
        public AuthorsController(IAuthorHandler handler)
            : base()
        {
            _handler = handler;
        }

        /// <summary>
        /// Получить список всех авторов
        /// </summary>
        /// <returns>Список авторов</returns>
        [HttpGet()]
        public async Task<ActionResult<IEnumerable<AuthorInfo>>> GetAllAuthors()
        {
            return Ok(await _handler.GetAllAuthors(OperationContext));
        }

        /// <summary>
        /// Получить список авторов, которых пользователь добавил в избранное
        /// </summary>
        /// <returns>Список авторов</returns>
        [HttpGet("favorite")]
        public async Task<ActionResult<IEnumerable<AuthorInfo>>> GetFavoriteAuthors()
        {
            return Ok(await _handler.GetFavoriteAuthors(OperationContext));
        }

        /// <summary>
        /// Поиск книг указанного автора
        /// </summary>
        /// <param name="id">Идентификатор автора</param>
        /// <returns>Список книг</returns>
        [HttpPost("{id}/books")]
        public async Task<ActionResult<IEnumerable<BookInfo>>> SearchByAuthor([FromRoute] string id)
        {
            return Ok(await _handler.SearchByAuthor(id, OperationContext));
        }

        /// <summary>
        /// Добавление автора в избранные
        /// </summary>
        /// <returns>Ok</returns>
        [HttpPost("favorite/{id}")]
        public async Task<IActionResult> AppendToFavorites([FromRoute] string id)
        {
            await _handler.AddToFavorite(id, OperationContext);
            return Ok();
        }

        /// <summary>
        /// Удаление автора из избранных
        /// </summary>
        /// <returns>Ok</returns>
        [HttpDelete("favorite/{id}")]
        public async Task<IActionResult> RemoveFromFavorites([FromRoute] string id)
        {
            await _handler.RemoveFromFavorite(id, OperationContext);
            return Ok();
        }
    }
}
