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

namespace Ladaer.BackEnd.Controllers.Rewards
{
    /// <summary>
    /// Controller quản lý cấu hình phạt tự động
    /// </summary>
    [Route("api/[controller]")]
    [ApiController]
    [Authorize]
    public class AutoPenaltyConfigController : ControllerBase
    {
        private readonly IAutoPenaltyConfigService _configService;

        public AutoPenaltyConfigController(IAutoPenaltyConfigService configService)
        {
            _configService = configService;
        }

        /// <summary>
        /// Lấy cấu hình đang hiệu lực
        /// </summary>
        [HttpGet]
        [Authorize(Roles = "AutoPenaltyConfig.GetCurrentConfig")]
        public async Task<IActionResult> GetCurrentConfig()
        {
            try
            {
                var result = await _configService.GetCurrentConfig();
                if (result == null)
                {
                    return NotFound("Chưa có cấu hình nào");
                }
                return Ok(result);
            }
            catch (Exception ex)
            {
                return StatusCode(500, $"Lỗi hệ thống: {ex.Message}");
            }
        }

        /// <summary>
        /// Cập nhật cấu hình (tạo version mới)
        /// </summary>
        [HttpPut]
        [Authorize(Roles = "AutoPenaltyConfig.UpdateConfig")]
        public async Task<IActionResult> UpdateConfig([FromBody] AutoPenaltyConfigModel model)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            var currentUser = User.GetCurrentUser();
            if (currentUser == null || currentUser.UserId <= 0)
            {
                return BadRequest("Không xác định được người dùng");
            }

            try
            {
                var result = await _configService.UpdateConfig(model, currentUser);
                if (result.Result == Lada.Framework.DTO.Result.Success)
                {
                    return Ok(result);
                }
                return BadRequest(result);
            }
            catch (Exception ex)
            {
                return StatusCode(500, $"Lỗi hệ thống: {ex.Message}");
            }
        }

        /// <summary>
        /// Tạm dừng / Mở lại job tự động
        /// </summary>
        [HttpPut("Pause")]
        [Authorize(Roles = "AutoPenaltyConfig.TogglePause")]
        public async Task<IActionResult> TogglePause([FromBody] PauseRequest request)
        {
            var currentUser = User.GetCurrentUser();
            if (currentUser == null || currentUser.UserId <= 0)
            {
                return BadRequest("Không xác định được người dùng");
            }

            try
            {
                var result = await _configService.TogglePause(request.IsPaused, request.PauseReason, currentUser);
                if (result.Result == Lada.Framework.DTO.Result.Success)
                {
                    return Ok(result);
                }
                return BadRequest(result);
            }
            catch (Exception ex)
            {
                return StatusCode(500, $"Lỗi hệ thống: {ex.Message}");
            }
        }

        /// <summary>
        /// Tìm kiếm danh sách cấu hình
        /// </summary>
        [HttpPost("Search")]
        [Authorize(Roles = "AutoPenaltyConfig.Search")]
        public async Task<IActionResult> Search([FromBody] SmartTableParam param)
        {
            var result = await _configService.Search(param);
            return Ok(result);
        }

        /// <summary>
        /// Lấy chi tiết cấu hình theo ID
        /// </summary>
        [HttpGet("GetById/{id}")]
        [Authorize(Roles = "AutoPenaltyConfig.GetById")]
        public async Task<IActionResult> GetById(int id)
        {
            if (id <= 0) return BadRequest("ID không hợp lệ");

            try
            {
                var result = await _configService.GetById(id);
                if (result == null)
                {
                    return NotFound("Không tìm thấy cấu hình");
                }
                return Ok(result);
            }
            catch (Exception ex)
            {
                return StatusCode(500, $"Lỗi hệ thống: {ex.Message}");
            }
        }

        /// <summary>
        /// Tạo mới hoặc cập nhật cấu hình
        /// </summary>
        [HttpPost("CreateOrUpdate")]
        [Authorize(Roles = "AutoPenaltyConfig.CreateOrUpdate")]
        public async Task<IActionResult> CreateOrUpdate([FromBody] AutoPenaltyConfigModel model)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            var currentUser = User.GetCurrentUser();
            if (currentUser == null || currentUser.UserId <= 0)
            {
                return BadRequest("Không xác định được người dùng");
            }

            try
            {
                var result = await _configService.CreateOrUpdate(model, currentUser);
                if (result.Result == Lada.Framework.DTO.Result.Success)
                {
                    return Ok(result);
                }
                return BadRequest(result);
            }
            catch (Exception ex)
            {
                return StatusCode(500, $"Lỗi hệ thống: {ex.Message}");
            }
        }

        /// <summary>
        /// Xóa cấu hình
        /// </summary>
        [HttpDelete("Delete/{id}")]
        [Authorize(Roles = "AutoPenaltyConfig.Delete")]
        public async Task<IActionResult> Delete(int id)
        {
            if (id <= 0) return BadRequest("ID không hợp lệ");

            var currentUser = User.GetCurrentUser();
            if (currentUser == null || currentUser.UserId <= 0)
            {
                return BadRequest("Không xác định được người dùng");
            }

            try
            {
                var result = await _configService.Delete(id, currentUser);
                if (result.Result == Lada.Framework.DTO.Result.Success)
                {
                    return Ok(result);
                }
                return BadRequest(result);
            }
            catch (Exception ex)
            {
                return StatusCode(500, $"Lỗi hệ thống: {ex.Message}");
            }
        }
    }

    public class PauseRequest
    {
        public bool IsPaused { get; set; }
        public string? PauseReason { get; set; }
    }
}
