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

namespace Ladaer.BackEnd.Controllers.Finance
{
    /// <summary>
    /// Controller quản lý chi phí
    /// </summary>
    [Route("api/[controller]")]
    [ApiController]
    [Authorize]
    public class ExpenseController : ControllerBase
    {
        private readonly IExpenseService _expenseService;

        public ExpenseController(IExpenseService expenseService)
        {
            _expenseService = expenseService;
        }

        /// <summary>
        /// Tìm kiếm chi phí với phân trang
        /// </summary>
        /// <param name="param">Tham số tìm kiếm và phân trang</param>
        /// <returns>Danh sách chi phí</returns>
        [HttpPost("Search")]
        [Authorize(Roles = "Expense.Search")]
        public async Task<IActionResult> Search([FromBody] SmartTableParam param)
        {
            try
            {
                var currentUser = User.GetCurrentUser();
                if (currentUser == null || currentUser.UserId <= 0)
                {
                    return BadRequest("Không xác định được người dùng");
                }

                var result = await _expenseService.Search(param, currentUser);
                return Ok(result);
            }
            catch (Exception ex)
            {
                return StatusCode(500, $"Lỗi hệ thống: {ex.Message}");
            }
        }

        /// <summary>
        /// Lấy chi phí theo ID
        /// </summary>
        /// <param name="id">ID chi phí</param>
        /// <returns>Thông tin chi phí</returns>
        [HttpGet("{id}")]
        [Authorize(Roles = "Expense.GetById")]
        public async Task<IActionResult> GetById(Guid id)
        {
            if (id == Guid.Empty)
            {
                return BadRequest("ID không hợp lệ");
            }

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

                var result = await _expenseService.GetById(id, currentUser);
                if (result == null)
                {
                    return NotFound("Không tìm thấy chi phí");
                }

                return Ok(result);
            }
            catch (Exception ex)
            {
                return StatusCode(500, $"Lỗi hệ thống: {ex.Message}");
            }
        }

        /// <summary>
        /// Tạo hoặc cập nhật chi phí
        /// </summary>
        /// <param name="model">Thông tin chi phí</param>
        /// <returns>Kết quả tạo hoặc cập nhật</returns>
        [HttpPost("CreateOrUpdate")]
        [Authorize(Roles = "Expense.CreateOrUpdate")]
        public async Task<IActionResult> CreateOrUpdate([FromBody] ExpenseModel 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 _expenseService.CreateOrUpdate(model, currentUser);
                if (result.Result == Lada.Framework.DTO.Result.Success)
                {
                    return Ok(result);
                }
                else
                {
                    return BadRequest(result);
                }
            }
            catch (Exception ex)
            {
                return StatusCode(500, $"Lỗi hệ thống: {ex.Message}");
            }
        }

        /// <summary>
        /// Duyệt chi phí
        /// </summary>
        /// <param name="id">ID chi phí</param>
        /// <returns>Kết quả duyệt</returns>
        [HttpPost("Approve/{id}")]
        [Authorize(Roles = "Expense.Approve")]
        public async Task<IActionResult> Approve(Guid id)
        {
            if (id == Guid.Empty)
            {
                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 _expenseService.Approve(id, currentUser);
                if (result.Result == Lada.Framework.DTO.Result.Success)
                {
                    return Ok(result);
                }
                else
                {
                    return BadRequest(result);
                }
            }
            catch (Exception ex)
            {
                return StatusCode(500, $"Lỗi hệ thống: {ex.Message}");
            }
        }

        /// <summary>
        /// Bỏ duyệt chi phí (chuyển về trạng thái chờ duyệt)
        /// </summary>
        /// <param name="id">ID chi phí</param>
        /// <returns>Kết quả bỏ duyệt</returns>
        [HttpPost("Unapprove/{id}")]
        [Authorize(Roles = "Expense.Approve")]
        public async Task<IActionResult> Unapprove(Guid id)
        {
            if (id == Guid.Empty)
            {
                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 _expenseService.Unapprove(id, currentUser);
                if (result.Result == Lada.Framework.DTO.Result.Success)
                {
                    return Ok(result);
                }
                else
                {
                    return BadRequest(result);
                }
            }
            catch (Exception ex)
            {
                return StatusCode(500, $"Lỗi hệ thống: {ex.Message}");
            }
        }

        /// <summary>
        /// Từ chối chi phí
        /// </summary>
        /// <param name="id">ID chi phí</param>
        /// <param name="request">Thông tin từ chối</param>
        /// <returns>Kết quả từ chối</returns>
        [HttpPost("Reject/{id}")]
        [Authorize(Roles = "Expense.Reject")]
        public async Task<IActionResult> Reject(Guid id, [FromBody] RejectExpenseRequest request)
        {
            if (id == Guid.Empty)
            {
                return BadRequest("ID không hợp lệ");
            }

            if (string.IsNullOrWhiteSpace(request.RejectReason))
            {
                return BadRequest("Lý do từ chối 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 _expenseService.Reject(id, request.RejectReason, currentUser);
                if (result.Result == Lada.Framework.DTO.Result.Success)
                {
                    return Ok(result);
                }
                else
                {
                    return BadRequest(result);
                }
            }
            catch (Exception ex)
            {
                return StatusCode(500, $"Lỗi hệ thống: {ex.Message}");
            }
        }

        /// <summary>
        /// Đánh dấu chi phí đã chuyển tiền
        /// </summary>
        /// <param name="id">ID chi phí</param>
        /// <param name="request">Thông tin chuyển tiền</param>
        /// <returns>Kết quả đánh dấu chuyển tiền</returns>
        [HttpPost("MarkAsPaid/{id}")]
        [Authorize(Roles = "Expense.MarkAsPaid")]
        public async Task<IActionResult> MarkAsPaid(Guid id, [FromBody] MarkAsPaidExpenseRequest request)
        {
            if (id == Guid.Empty)
            {
                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 _expenseService.MarkAsPaid(id, currentUser, request.Note);
                if (result.Result == Lada.Framework.DTO.Result.Success)
                {
                    return Ok(result);
                }
                else
                {
                    return BadRequest(result);
                }
            }
            catch (Exception ex)
            {
                return StatusCode(500, $"Lỗi hệ thống: {ex.Message}");
            }
        }

        /// <summary>
        /// Xóa chi phí
        /// </summary>
        /// <param name="id">ID chi phí</param>
        /// <returns>Kết quả xóa</returns>
        [HttpDelete("{id}")]
        [Authorize(Roles = "Expense.Delete")]
        public async Task<IActionResult> Delete(Guid id)
        {
            if (id == Guid.Empty)
            {
                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 _expenseService.Delete(id, currentUser);
                if (result.Result == Lada.Framework.DTO.Result.Success)
                {
                    return Ok(result);
                }
                else
                {
                    return BadRequest(result);
                }
            }
            catch (Exception ex)
            {
                return StatusCode(500, $"Lỗi hệ thống: {ex.Message}");
            }
        }
    }

    /// <summary>
    /// Request model cho việc từ chối chi phí
    /// </summary>
    public class RejectExpenseRequest
    {
        /// <summary>
        /// Lý do từ chối (bắt buộc)
        /// </summary>
        public string RejectReason { get; set; } = "";
    }

    /// <summary>
    /// Request model cho việc đánh dấu chi phí đã chuyển tiền
    /// </summary>
    public class MarkAsPaidExpenseRequest
    {
        /// <summary>
        /// Ghi chú cho giao dịch chuyển tiền
        /// </summary>
        public string Note { get; set; } = "";
    }
}