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

namespace Ladaer.BackEnd.Controllers.Systems
{
    /// <summary>
    /// Controller quản lý cấu hình ứng dụng (AppConfig)
    /// </summary>
    [Route("api/[controller]")]
    [ApiController]
    [Authorize]
    public class AppConfigController : ControllerBase
    {
        private readonly IAppConfigManagementService _appConfigService;

        public AppConfigController(IAppConfigManagementService appConfigService)
        {
            _appConfigService = appConfigService;
        }

        /// <summary>
        /// Tìm kiếm AppConfig với SmartTable
        /// </summary>
        /// <param name="param">Tham số tìm kiếm</param>
        /// <returns>Kết quả tìm kiếm</returns>
        [HttpPost("Search")]
        [Authorize(Roles = "AppConfig.Search")]
        public async Task<IActionResult> Search([FromBody] SmartTableParam param)
        {
            var result = await _appConfigService.Search(param);
            return Ok(result);
        }

        /// <summary>
        /// Lấy AppConfig theo Id
        /// </summary>
        /// <param name="id">Id của AppConfig</param>
        /// <returns>AppConfig</returns>
        [HttpGet("GetById")]
        [Authorize(Roles = "AppConfig.GetById")]
        public async Task<IActionResult> GetById(int id)
        {
            var result = await _appConfigService.GetById(id);
            if (result == null)
            {
                return NotFound("Không tìm thấy cấu hình");
            }
            return Ok(result);
        }

        /// <summary>
        /// Tạo hoặc cập nhật AppConfig
        /// </summary>
        /// <param name="model">Model AppConfig</param>
        /// <returns>Kết quả thao tác</returns>
        [HttpPost("CreateOrUpdate")]
        [Authorize(Roles = "AppConfig.CreateOrUpdate")]
        public async Task<IActionResult> CreateOrUpdate([FromBody] CreateAppConfigModel model)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            var currentUser = User.GetCurrentUser();
            model.UpdatedBy = currentUser.UserId;
            model.UpdatedByUserName = currentUser.UserName;

            if (model.UpdatedBy <= 0 || string.IsNullOrEmpty(model.UpdatedByUserName))
            {
                return BadRequest("Không xác định được người dùng");
            }

            var result = await _appConfigService.CreateOrUpdate(model);
            return Ok(result);
        }

        /// <summary>
        /// Xóa AppConfig
        /// </summary>
        /// <param name="id">Id của AppConfig</param>
        /// <returns>Kết quả xóa</returns>
        [HttpDelete("Delete")]
        [Authorize(Roles = "AppConfig.Delete")]
        public async Task<IActionResult> Delete(int id)
        {
            var result = await _appConfigService.Delete(id);
            return Ok(result);
        }

        /// <summary>
        /// Reload cache cho tất cả applications
        /// </summary>
        /// <returns>Kết quả reload</returns>
        [HttpPost("ReloadCache")]
        [Authorize(Roles = "AppConfig.Manage")]
        public async Task<IActionResult> ReloadCache()
        {
            var result = await _appConfigService.ReloadCache();
            return Ok(result);
        }
    }
}