
using Lada.Framework.DTO;
using Lada.Framework.DTO.SmartTable;
using Lada.Framework.Infrastructures.Helpers;
using Ladaer.BackEnd.Infrastructures.DTO.Models.Settings;
using Ladaer.BackEnd.Infrastructures.Services.Settings;
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 call path.
    /// </summary>
    [Route("api/[controller]")]
    [ApiController]
    [Authorize]
    public class CallPathController : ControllerBase
    {
        private readonly ICallPathService _callPathService;

        /// <summary>
        /// Khởi tạo một instance mới của lớp <see cref="CallPathController"/>.
        /// </summary>
        /// <param name="callPathService">Dịch vụ xử lý call path.</param>
        public CallPathController(ICallPathService callPathService)
        {
            _callPathService = callPathService;
        }

        /// <summary>
        /// Lấy danh sách tất cả call path.
        /// </summary>
        /// <returns>Danh sách tất cả call path.</returns>
        [HttpGet("GetAll")]
        public async Task<IActionResult> GetAll()
        {
            var result = await _callPathService.GetAllAsync();
            return Ok(result);
        }

        #region Search
        /// <summary>
        /// Tìm kiếm các call path 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 = "Founder")]
        public async Task<IActionResult> Search([FromBody] SmartTableParam param)
        {
            var apps = await _callPathService.SearchAsync(param);
            return Ok(apps);
        }
        #endregion


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

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

                return Ok(result);
            }
            result = await _callPathService.CreateOrUpdateAsync(callPathModel);
            return Ok(result);
        }

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

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