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

namespace Ladaer.BackEnd.Controllers.Finance
{
    /// <summary>
    /// Controller xử lý các yêu cầu liên quan đến ví điện tử.
    /// </summary>
    [Route("api/[controller]")]
    [ApiController]
    [Authorize]
    public class WalletController : ControllerBase
    {
        private readonly IWalletService _walletService;
        private readonly IWalletTransferService _walletTransferService;
        private readonly IUserService _userService;

        public WalletController(
            IWalletService walletService,
            IWalletTransferService walletTransferService,
            IUserService userService)
        {
            _walletService = walletService;
            _walletTransferService = walletTransferService;
            _userService = userService;
        }



        /// <summary>
        /// Tìm kiếm danh sách các ví điện tử dựa trên các tham số được cung cấp.
        /// </summary>
        /// <param name="param">Các tham số tìm kiếm.</param>
        /// <returns>Kết quả tìm kiếm.</returns>
        [HttpPost("Search")]
        [Authorize(Roles = "Wallet.Search")]
        public async Task<IActionResult> Search([FromBody] SmartTableParam param)
        {
            var agencies = await _walletService.Search(param);
            return Ok(agencies);
        }

        /// <summary>
        /// Tìm kiếm danh sách các giao dịch của ví điện tử dựa trên các tham số được cung cấp.
        /// </summary>
        /// <param name="param">Các tham số tìm kiếm.</param>
        /// <returns>Kết quả tìm kiếm.</returns>
        [HttpPost("GetTransactions")]
        [Authorize(Roles = "Wallet.GetTransactions")]
        public async Task<IActionResult> GetTransactions([FromBody] SmartTableParam param)
        {
            var transactions = await _walletService.SearchTransactions(param);
            return Ok(transactions);
        }




        /// <summary>
        /// Lấy danh sách ví cho suggestion (select control).
        /// </summary>
        /// <param name="keyword">Từ khóa tìm kiếm (tên, số điện thoại, username).</param>
        /// <returns>Danh sách tối đa 20 ví.</returns>
        [HttpGet("GetSuggestions")]
        [Authorize(Roles = "Wallet.GetSuggestions")]
        public async Task<IActionResult> GetSuggestions([FromQuery] string keyword)
        {
            var result = await _walletService.GetSuggestions(keyword);
            return Ok(result);
        }

        /// <summary>
        /// Lấy thông tin chi tiết của ví điện tử dựa trên ID.
        /// </summary>
        /// <param name="id">ID ví.</param>
        /// <returns>Thông tin chi tiết của ví.</returns>
        [HttpGet("GetById")]
        [Authorize(Roles = "Wallet.GetById")]
        public async Task<IActionResult> GetById(int id)
        {
            var currentUser = User.GetCurrentUser();
            if (currentUser == null)
            {
                return Unauthorized();
            }

            var result = await _walletService.GetById(id, currentUser.UserId);
            return Ok(result);
        }

        /// <summary>
        /// Lấy thông tin chi tiết của ví điện tử của người dùng đang đăng nhập.
        /// </summary>
        /// <returns>Thông tin chi tiết của ví.</returns>
        [HttpGet("GetMyWallet")]
        [Authorize(Roles = "Wallet.GetMyWallet")]
        public async Task<IActionResult> GetMyWallet()
        {
            var currentUser = User.GetCurrentUser();
            if (currentUser == null)
            {
                return Unauthorized();
            }

            // Lấy ví của người dùng hiện tại
            var userWallet = await _walletService.GetWalletByUserId(currentUser.UserId, currentUser.UserId);
            if (userWallet == null || userWallet.Id <= 0)
            {
                return NotFound(new { message = "Không tìm thấy ví của người dùng" });
            }

            return Ok(userWallet);
        }


        /// <summary>
        /// Chuyển tiền từ ví của người dùng đang đăng nhập sang ví đích.
        /// Ví nguồn sẽ được lấy tự động từ người dùng hiện tại.
        /// </summary>
        /// <param name="model">Thông tin chuyển tiền</param>
        /// <returns>Kết quả chuyển tiền</returns>
        [HttpPost("Transfer")]
        [Authorize(Roles = "Wallet.Transfer")]
        public async Task<IActionResult> Transfer([FromForm] TransferWalletModel model)
        {
            var currentUser = User.GetCurrentUser();
            if (currentUser == null)
            {
                return Unauthorized();
            }

            // Validate ảnh chứng từ
            if (model.ProofImage == null)
            {
                return BadRequest(new { message = "Vui lòng upload ảnh chứng từ" });
            }

            // Lấy ví của người dùng hiện tại
            var userWallet = await _walletService.GetWalletByUserId(currentUser.UserId, currentUser.UserId);
            if (userWallet == null)
            {
                return BadRequest(new { message = "Không tìm thấy ví của người dùng" });
            }

            model.UpdatedBy = currentUser.UserId;
            model.UpdatedByUserName = currentUser.UserName;

            var result = await _walletTransferService.Transfer(userWallet.Id, model);
            return Ok(result);
        }

        /// <summary>
        /// Điều chỉnh số dư ví (cân ví) - chỉ dành cho Founder và Accountant.
        /// Tạo giao dịch để khớp số dư ví với số dư mong muốn.
        /// </summary>
        /// <param name="walletId">ID ví cần điều chỉnh</param>
        /// <param name="model">Thông tin điều chỉnh</param>
        /// <returns>Kết quả điều chỉnh</returns>
        [HttpPost("BalanceAdjustment/{walletId}")]
        [Authorize(Roles = "Founder")]
        public async Task<IActionResult> BalanceAdjustment(int walletId, [FromBody] BalanceAdjustmentModel model)
        {
            var currentUser = User.GetCurrentUser();
            if (currentUser == null)
            {
                return Unauthorized();
            }

            model.UpdatedBy = currentUser.UserId;
            model.UpdatedByUserName = currentUser.UserName;

            var result = await _walletService.BalanceAdjustment(walletId, model);

            if (result.Result == Lada.Framework.DTO.Result.Success)
            {
                return Ok(result);
            }
            else
            {
                return BadRequest(result);
            }
        }
    }
}
