using Lada.Framework.DTO.SmartTable;
using Lada.Framework.Infrastructures.Helpers;
using Ladaer.BackEnd.Infrastructures.DTO.Models.Categories;
using Ladaer.BackEnd.Infrastructures.Services.Categories;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;

namespace Ladaer.BackEnd.Controllers.Systems
{
    /// <summary>
    /// Controller để xử lý các hoạt động liên quan đến đại lý.
    /// </summary>
    [Route("api/[controller]")]
    [ApiController]
    [Authorize]
    public class AgencyController : ControllerBase
    {
        private readonly IAgencyService _agencyService;

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

        /// <summary>
        /// Tìm kiếm các đại lý 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 = "Agency.Search")]
        public async Task<IActionResult> Search([FromBody] SmartTableParam param)
        {
            var agencies = await _agencyService.Search(param);
            return Ok(agencies);
        }

        /// <summary>
        /// Tạo hoặc cập nhật thông tin đại lý.
        /// </summary>
        /// <param name="agencyModel">Model chứa thông tin đại lý.</param>
        /// <returns>Kết quả của hoạt động tạo hoặc cập nhật.</returns>
        [HttpPost("CreateOrUpdate")]
        [Authorize(Roles = "Agency.CreateOrUpdate")]
        public async Task<IActionResult> CreateOrUpdate([FromBody] AgencyModel agencyModel)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }
            var currentUser = User.GetCurrentUser();
            agencyModel.UpdatedBy = currentUser.UserId;
            agencyModel.UpdatedByUserName = currentUser.UserName;
            if (agencyModel.UpdatedBy <= 0 || string.IsNullOrEmpty(agencyModel.UpdatedByUserName))
            {
                return BadRequest("Không xác định được người dùng");
            }
            var result = await _agencyService.CreateOrUpdate(agencyModel);
            return Ok(result);
        }

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

        /// <summary>
        /// Tìm kiếm đại lý dựa trên từ khóa.
        /// </summary>
        /// <param name="keyword">Từ khóa tìm kiếm.</param>
        /// <returns>Danh sách đại lý phù hợp.</returns>
        [HttpGet("AutoComplete")]
        [Authorize(Roles = "Agency.AutoComplete")]
        public async Task<IActionResult> AutoComplete(string keyword = "")
        {
            var result = await _agencyService.AutoComplete(keyword);
            return Ok(result);
        }

        /// <summary>
        /// Xóa một đại lý dựa trên ID.
        /// </summary>
        /// <param name="id">ID của đại lý.</param>
        /// <returns>Kết quả của hoạt động xóa.</returns>
        [HttpDelete("Delete")]
        [Authorize(Roles = "Agency.Delete")]
        public async Task<IActionResult> Delete(int id)
        {
            var currentUser = User.GetCurrentUser();
            if (currentUser == null)
            {
                return BadRequest("Không xác định được người dùng");
            }
            var result = await _agencyService.Delete(id, currentUser);
            return Ok(result);
        }

        /// <summary>
        /// Cập nhật trạng thái của một đại lý.
        /// </summary>
        /// <param name="agencyStatusModel">Model chứa thông tin trạng thái của đại lý.</param>
        /// <returns>Kết quả của hoạt động cập nhật trạng thái.</returns>
        [HttpPut("UpdateStatus")]
        [Authorize(Roles = "Agency.UpdateStatus")]
        public async Task<IActionResult> UpdateStatus([FromBody] AgencyStatusModel agencyStatusModel)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }
            var currentUser = User.GetCurrentUser();
            agencyStatusModel.UpdatedBy = currentUser.UserId;
            agencyStatusModel.UpdatedByUserName = currentUser.UserName;
            if (agencyStatusModel.UpdatedBy <= 0 || string.IsNullOrEmpty(agencyStatusModel.UpdatedByUserName))
            {
                return BadRequest("Không xác định được người dùng");
            }
            var result = await _agencyService.UpdateStatus(agencyStatusModel);
            return Ok(result);
        }

        #region Get Tree

        /// <summary>
        /// Lấy danh sách đại lý dưới dạng cây.
        /// </summary>
        /// <param name="keyword">Từ khóa tìm kiếm.</param>
        /// <returns>Danh sách đại lý dưới dạng cây.</returns>
        [HttpGet("GetTree")]
        [Authorize(Roles = "Founder")]
        public async Task<IActionResult> GetTree(string keyword = "")
        {
            var result = await _agencyService.GetTree(keyword);
            return Ok(result);
        }

        #endregion
    }
}
