using Microsoft.AspNetCore.Mvc;
using PetCompanion.Models;
using PetCompanion.Services;

namespace PetCompanion.Controllers
{
    [ApiController]
    [Route("api/v1/[controller]")]
    public class InventoryController : ControllerBase
    {
        private readonly PetInventoryService _inventoryService;
        private readonly ILogger<InventoryController> _logger;
        private readonly Guid userId = Guid.Parse("f5f4b3b3-3b7b-4b7b-8b7b-7b7b7b7b7b7b");

        public InventoryController(
            ILogger<InventoryController> logger,
            PetInventoryService inventoryService)
        {
            _logger = logger;
            _inventoryService = inventoryService;
        }

        [HttpGet("{petId}")]
        public async Task<IActionResult> GetInventory(string petId)
        {
            try
            {
                var inventory = await _inventoryService.GetInventory(petId, userId.ToString());
                return Ok(inventory);
            }
            catch (Exception ex)
            {
                return BadRequest(ex.Message);
            }
        }

        [HttpPut("{petId}/{itemId}/use")]
        public async Task<IActionResult> UseItem(string petId, int itemId)
        {
            try
            {
                var updatedPet = await _inventoryService.UseItem(petId, userId.ToString(), itemId);
                return Ok(updatedPet);
            }
            catch (Exception ex)
            {
                return BadRequest(ex.Message);
            }
        }

        [HttpPut("{petId}/{itemId}/equip")]
        public IActionResult EquipItem(string petId, int itemId)
        {
            try
            {
                var updatedPet = _inventoryService.EquipItem(petId, userId.ToString(), itemId);
                return Ok(updatedPet);
            }
            catch (Exception ex)
            {
                return BadRequest(ex.Message);
            }
        }

        [HttpPut("{petId}/{equipTarget}/unequip")]
        public IActionResult UnequipItem(string petId, ItemEquipTarget equipTarget)
        {
            try
            {
                var updatedPet = _inventoryService.UnequipItem(petId, userId.ToString(), equipTarget);
                return Ok(updatedPet);
            }
            catch (Exception ex)
            {
                return BadRequest(ex.Message);
            }
        }

        [HttpPut("{petId}/{itemId}/drop")]
        public IActionResult DropItem(string petId, int itemId)
        {
            try
            {
                var updatedPet = _inventoryService.DropItem(petId, userId.ToString(), itemId);
                return Ok(updatedPet);
            }
            catch (Exception ex)
            {
                return BadRequest(ex.Message);
            }
        }

        [HttpPost("{petId}/create")]
        public IActionResult AddItem(string petId, [FromBody] AddItemRequest request)
        {
            try
            {
                var updatedPet = _inventoryService.AddItemToPet(petId, userId.ToString(), request.ItemId, request.Quantity);
                return Ok(updatedPet);
            }
            catch (Exception ex)
            {
                return BadRequest(ex.Message);
            }
        }
    }

    public class AddItemRequest
    {
        public int ItemId { get; set; }
        public int Quantity { get; set; } = 1;
    }
}