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 tới điểm đầu cuối.
    /// </summary>
    [Route("api/[controller]")]
    [ApiController]
    [Authorize]
    public class EndPointsController : ControllerBase
    {
        private readonly IEndPointsService _endPointsService;

        /// <summary>
        /// Khởi tạo môt instance mới của lớp <see cref="EndPointsController"/>.
        /// </summary>
        /// <param name="endPointsService">Dịch vụ xử lý điểm đầu cuối.</param>
        public EndPointsController(IEndPointsService endPointsService)
        {
            _endPointsService = endPointsService;
        }

        /// <summary>
        /// Tìm kiếm các điểm đầu cuối dựa trên các tham số tìm kiếm.
        /// </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 = "EndPoints.Search")]
        public async Task<IActionResult> Search([FromBody] SmartTableParam param)
        {
            var locations = await _endPointsService.Search(param);
            return Ok(locations);
        }

        /// <summary>
        /// Tạo hoặc cập nhật thông tin điểm đầu cuối.
        /// </summary>
        /// <param name="endPointsModel">Model chứa thông tin điểm đầu cuối.</param>
        /// <returns>Kết quả của hoạt động tạo hoặc cập nhật.</returns>
        [HttpPost("CreateOrUpdate")]
        [Authorize(Roles = "EndPoints.CreateOrUpdate")]
        public async Task<IActionResult> CreateOrUpdate([FromBody] EndPointsModel endPointsModel)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }
            var currentUser = User.GetCurrentUser();
            endPointsModel.UpdatedBy = currentUser.UserId;
            endPointsModel.UpdatedByUserName = currentUser.UserName;
            if (endPointsModel.UpdatedBy <= 0 || string.IsNullOrEmpty(endPointsModel.UpdatedByUserName))
            {
                return BadRequest("Kh�ng x�c d?nh du?c ngu?i d�ng");
            }

            var result = await _endPointsService.CreateOrUpdate(endPointsModel);
            return Ok(result);
        }

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

        /// <summary>
        /// Xóa một điểm đầu cuối dựa trên ID.
        /// </summary>
        /// <param name="id">ID của điểm đầu cuối.</param>
        /// <returns>Kết quả của hoạt động xóa.</returns>
        [HttpDelete("Delete")]
        [Authorize(Roles = "EndPoints.Delete")]
        public async Task<IActionResult> Delete(int id)
        {
            var currentUser = User.GetCurrentUser();
            if (currentUser == null)
            {
                return BadRequest("Kh�ng x�c d?nh du?c ngu?i d�ng");
            }
            var result = await _endPointsService.Delete(id, currentUser);
            return Ok(result);
        }

        /// <summary>
        /// Tạo các điểm đầu cuối tự động.
        /// </summary>
        /// <returns>Kết quả của hoạt động tạo.</returns>
        [HttpPost("AutoGenerate")]
        [Authorize(Roles = "EndPoints.AutoGenerate")]
        public async Task<IActionResult> AutoGenerate()
        {
            var currentUser = User.GetCurrentUser();
            var locations = await _endPointsService.AutoGenerate(currentUser);
            return Ok(locations);
        }
    }
}
