using Lada.Framework.Data.Enums;
using Lada.Framework.DTO.SmartTable;
using Lada.Framework.Infrastructures.Helpers;
using Ladaer.BackEnd.Infrastructures.DTO.Models.Cms;
using Ladaer.BackEnd.Infrastructures.DTO.Results.Cms;
using Ladaer.BackEnd.Infrastructures.Services.Cms;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;

namespace Ladaer.BackEnd.Controllers.Cms
{
    /// <summary>
    /// Controller d? x? l� c�c ho?t d?ng li�n quan d?n danh m?c.
    /// </summary>
    [Route("api/[controller]")]
    [ApiController]
    [Authorize]
    public class CategoryController : ControllerBase
    {
        private readonly ICategoryService _categoryService;

        /// <summary>
        /// Khởi tạo một instance mới của lớp <see cref="CategoryController"/>.
        /// </summary>
        /// <param name="categoryService">Dịch vụ xử lý danh mục.</param>
        public CategoryController(ICategoryService categoryService)
        {
            _categoryService = categoryService;
        }

        #region Search
        /// <summary>
        /// Tìm kiếm các danh mục dựa trên các tham số được cung cấp.
        /// </summary>
        /// <param name="param">Các tham số tìm kiếm.</param>
        /// <returns>Kết quả tìm kiếm.</returns>
        [HttpPost("Search")]
        [Authorize(Roles = "Category.Search")]
        public async Task<IActionResult> Search([FromBody] SmartTableParam param)
        {
            var apps = await _categoryService.Search(param);
            return Ok(apps);
        }
        #endregion

        #region Get Tree
        /// <summary>
        /// Lấy danh sách danh mục dưới dạng cây.
        /// </summary>
        /// <param name="keyword">Từ khóa tìm kiếm.</param>
        /// <returns>Danh sách danh mục dưới dạng cây.</returns>
        [HttpGet("GetTree")]
        [Authorize(Roles = "Category.GetTree")]
        public async Task<IActionResult> GetTree(string keyword = "",ContentType contentType = ContentType.Post)
        {
            var result = await _categoryService.GetTree(keyword, contentType);
            return Ok(result);
        }
        #endregion

        #region CRUD
        /// <summary>
        /// Tạo hoặc cập nhật thông tin danh mục.
        /// </summary>
        /// <param name="categoryModel">Model chứa thông tin danh mục.</param>
        /// <returns>Kết quả của hoạt động tạo hoặc cập nhật.</returns>
        [HttpPost("CreateOrUpdate")]
        [Authorize(Roles = "Category.CreateOrUpdate")]
        public async Task<IActionResult> CreateOrUpdate([FromBody] CategoryModel categoryModel)
        {
            var result = new CategoryResult();
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }
            var currentUser = User.GetCurrentUser();
            categoryModel.UpdatedBy = currentUser.UserId;
            categoryModel.UpdatedByUserName = currentUser.UserName;

            if (categoryModel.UpdatedBy <= 0 || string.IsNullOrEmpty(categoryModel.UpdatedByUserName))
            {
                result.Result = Lada.Framework.DTO.Result.Failed;
                result.Message = $"Không xác định được người dùng {currentUser.UserId} - {currentUser.UserName} ";

                return Ok(result);
            }
            result = await _categoryService.CreateOrUpdate(categoryModel);
            return Ok(result);
        }

        /// <summary>
        /// Lấy thông tin chi tiết của một danh mục dựa trên ID.
        /// </summary>
        /// <param name="id">ID của danh mục.</param>
        /// <returns>Thông tin chi tiết của danh mục.</returns>
        [HttpGet("GetById")]
        [Authorize(Roles = "Category.GetById")]
        public async Task<IActionResult> GetById(int id)
        {
            var result = await _categoryService.GetById(id);
            return Ok(result);
        }

        /// <summary>
        /// Xóa một danh mục dựa trên ID.
        /// </summary>
        /// <param name="id">ID của danh mục.</param>
        /// <returns>Kết quả của hoạt động xóa.</returns>
        [HttpDelete("Delete")]
        [Authorize(Roles = "Category.Delete")]
        public async Task<IActionResult> Delete(int id)
        {
            var result = await _categoryService.Delete(id);
            return Ok(result);
        }
        #endregion
    }
}
