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

namespace Ladaer.BackEnd.Controllers.Rewards
{
    /// <summary>
    /// Controller quản lý phiếu thưởng/phạt
    /// </summary>
    [Route("api/[controller]")]
    [ApiController]
    [Authorize]
    public class RewardPenaltyController : ControllerBase
    {
        private readonly IRewardPenaltyService _rewardPenaltyService;

        public RewardPenaltyController(IRewardPenaltyService rewardPenaltyService)
        {
            _rewardPenaltyService = rewardPenaltyService;
        }

        /// <summary>
        /// Tìm kiếm phiếu thưởng/phạt
        /// </summary>
        [HttpPost("Search")]
        [Authorize(Roles = "RewardPenalty.Search")]
        public async Task<IActionResult> Search([FromBody] SmartTableParam param)
        {
            var result = await _rewardPenaltyService.Search(param);
            return Ok(result);
        }

        /// <summary>
        /// Lấy phiếu thưởng/phạt theo ID
        /// </summary>
        [HttpGet("{id}")]
        [Authorize(Roles = "RewardPenalty.GetById")]
        public async Task<IActionResult> GetById(int id)
        {
            if (id <= 0) return BadRequest("ID không hợp lệ");

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




        /// <summary>
        /// Tạo phiếu thưởng/phạt thủ công
        /// </summary>
        [HttpPost("Manual")]
        [Authorize(Roles = "RewardPenalty.Manual")]
        public async Task<IActionResult> CreateManual([FromBody] RewardPenaltyTicketModel 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 _rewardPenaltyService.CreateManual(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>
        /// Duyệt phiếu
        /// </summary>
        [HttpPost("Approve/{id}")]
        [Authorize(Roles = "RewardPenalty.Approve")]
        public async Task<IActionResult> Approve(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 _rewardPenaltyService.Approve(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}");
            }
        }

        /// <summary>
        /// Từ chối phiếu
        /// </summary>
        [HttpPost("Reject/{id}")]
        [Authorize(Roles = "RewardPenalty.Reject")]
        public async Task<IActionResult> Reject(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 _rewardPenaltyService.Reject(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}");
            }
        }

        /// <summary>
        /// Gỡ/hủy phiếu (có giới hạn amnesty nếu Auto)
        /// </summary>
        [HttpPost("Cancel/{id}")]
        [Authorize(Roles = "RewardPenalty.Cancel")]
        public async Task<IActionResult> Cancel(int id, [FromBody] CancelTicketRequest request)
        {
            if (id <= 0) return BadRequest("ID không hợp lệ");

            if (string.IsNullOrWhiteSpace(request.Reason))
            {
                return BadRequest("Lý do gỡ không được để trống");
            }

            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 _rewardPenaltyService.Cancel(id, request.Reason, 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 CancelTicketRequest
    {
        /// <summary>
        /// Lý do gỡ biên bản (bắt buộc)
        /// </summary>
        public string Reason { get; set; } = "";
    }
}
