using Lada.Framework.Infrastructures.Helpers;
using Ladaer.BackEnd.Infrastructures.DTO.Models.Orders;
using Ladaer.BackEnd.Infrastructures.DTO.Models.Orders.Shared;
using Ladaer.BackEnd.Infrastructures.Services.Orders;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;

namespace Ladaer.BackEnd.Controllers.Orders
{
    /// <summary>
    /// Controller để xử lý các hoạt động liên quan đến tài chính đơn hàng.
    /// </summary>
    [Route("api/[controller]")]
    [ApiController]
    [Authorize]
    public class OrderFinController : ControllerBase
    {
        private readonly IOrderFinService _orderFinService;

        /// <summary>
        /// Khởi tạo một instance mới của lớp <see cref="OrderFinController"/>.
        /// </summary>
        /// <param name="orderFinService">Dịch vụ xử lý tài chính đơn hàng.</param>
        public OrderFinController(IOrderFinService orderFinService)
        {
            _orderFinService = orderFinService;
        }

        /// <summary>
        /// Lấy thông tin chi tiết của tài chính đơn hàng dựa trên ID.
        /// </summary>
        /// <param name="id">ID của tài chính đơn hàng.</param>
        /// <returns>Thông tin chi tiết của tài chính đơn hàng.</returns>
        [HttpGet("GetById")]
        [Authorize(Roles = "OrderFin.GetById")]
        public async Task<IActionResult> GetById(int id)
        {
            var result = await _orderFinService.GetById(id);
            return Ok(result);
        }

        /// <summary>
        /// Cập nhật thông tin tài chính đơn hàng.
        /// </summary>
        /// <param name="model">Model chứa thông tin tài chính đơn hàng.</param>
        /// <returns>Kết quả của hoạt động cập nhật.</returns>
        [HttpPut("Update")]
        [Authorize(Roles = "OrderFin.Update")]
        public async Task<IActionResult> Update([FromBody] UpdateOrderFinModel 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 _orderFinService.Update(model);
            return Ok(result);
        }


        /// <summary>
        /// Thu tiền
        /// </summary>
        /// <param name="model">Model chứa thông tin tài chính đơn hàng.</param>
        /// <returns>Kết quả của hoạt động cập nhật.</returns>
        [HttpPut("CollectMoney")]
        [Authorize(Roles = "OrderFin.Collect")]
        public async Task<IActionResult> Collect([FromBody] CollectMoneyModel 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 _orderFinService.Collect(model);
            return Ok(result);
        }
    }
}
