using API.BusinessLogic;
using API.Models.ShoppingListModels;
using Microsoft.AspNetCore.Mvc;
using System.Security.Claims;

namespace API.Controllers
{
    [ApiController]
    [Route("api/[controller]")]
    public class ShoppingListController : Controller
    {
        private readonly ShoppingListLogic _shoppingListLogic;

        public ShoppingListController(ShoppingListLogic shoppingListLogic)
        {
            _shoppingListLogic = shoppingListLogic;
        }

        [HttpGet("get")]
        public async Task<IActionResult> ReadShoppingList()
        {
            var claims = HttpContext.User.Claims;
            string userIdString = claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier).Value;
            int userId = Convert.ToInt32(userIdString);
            return await _shoppingListLogic.ReadShoppingList(userId);
        }

        [HttpPost("add")]
        public async Task<IActionResult> AddItem([FromBody] ShoppingListItemDTO listItemDTO)
        {
            var claims = HttpContext.User.Claims;
            string userIdString = claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier).Value;
            int userId = Convert.ToInt32(userIdString);
            return await _shoppingListLogic.AddItemToShoppingList(listItemDTO, userId);
        }

        [HttpPut("check")]
        public async Task<IActionResult> CheckItem(int itemId)
        {
            var claims = HttpContext.User.Claims;
            string userIdString = claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier).Value;
            int userId = Convert.ToInt32(userIdString);
            return await _shoppingListLogic.CheckItemInShoppingList(userId, itemId);
        }

        [HttpPut("update")]
        public async Task<IActionResult> UpdateItem([FromBody] ShoppingListItemDTO listItemDTO, int itemId)
        {
            var claims = HttpContext.User.Claims;
            string userIdString = claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier).Value;
            int userId = Convert.ToInt32(userIdString);
            return await _shoppingListLogic.UpdateItemInShoppingList(userId, itemId, listItemDTO);
        }

        [HttpDelete("delete")]
        public async Task<IActionResult> DeleteItem(int itemId)
        {
            var claims = HttpContext.User.Claims;
            string userIdString = claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier).Value;
            int userId = Convert.ToInt32(userIdString);
            return await _shoppingListLogic.DeleteItemInShoppingList(userId, itemId);
        }

        [HttpPost("recipeadd")]
        public async Task<IActionResult> AddARecipesItems(int recipeId)
        {
            var claims = HttpContext.User.Claims;
            string userIdString = claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier).Value;
            int userId = Convert.ToInt32(userIdString);
            return await _shoppingListLogic.AddRecipeToShoppingList(userId, recipeId);
        }
    }
}