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

namespace Ladaer.BackEnd.Controllers.Finance
{
    [ApiController]
    [Route("api/[controller]")]
    [Authorize]
    public class TransactionController : ControllerBase
    {
        private readonly ITransactionService _transactionService;

        public TransactionController(ITransactionService transactionService)
        {
            _transactionService = transactionService;
        }

        /// <summary>
        /// Tìm kiếm giao dịch của ví.
        /// Service sẽ tự động kiểm tra quyền: chỉ Founder và Accountant mới xem tất cả, user khác chỉ xem ví của mình.
        /// </summary>
        /// <param name="param">Tham số tìm kiếm</param>
        /// <returns>Danh sách giao dịch với tổng thu và tổng chi</returns>
        [HttpPost("SearchWalletTransactions")]
        [Authorize(Roles = "Transaction.SearchWalletTransactions")]
        public async Task<IActionResult> SearchWalletTransactions([FromBody] SmartTableParam param)
        {
            var currentUser = User.GetCurrentUser();
            if (currentUser == null)
            {
                return Unauthorized();
            }

            var result = await _transactionService.SearchWalletTransactions(param, currentUser.UserId);
            return Ok(result);
        }

        /// <summary>
        /// Lấy chi tiết giao dịch (chỉ cho TransactionType = 4)
        /// </summary>
        /// <param name="id">ID của giao dịch</param>
        /// <returns>Chi tiết giao dịch</returns>
        [HttpGet("{id:guid}")]
        [Authorize(Roles = "Transaction.GetDetail")]
        public async Task<IActionResult> GetDetail(Guid id)
        {
            var result = await _transactionService.GetTransactionDetail(id);
            return Ok(result);
        }

        /// <summary>
        /// Lấy thống kê giao dịch theo loại
        /// </summary>
        /// <param name="walletId">ID ví</param>
        /// <param name="startDate">Ngày bắt đầu (optional)</param>
        /// <param name="endDate">Ngày kết thúc (optional)</param>
        /// <returns>Thống kê giao dịch</returns>
        [HttpGet("Statistics/{walletId}")]
        [Authorize(Roles = "Transaction.GetStatistics")]
        public async Task<IActionResult> GetStatistics(int walletId, [FromQuery] DateTimeOffset? startDate = null, [FromQuery] DateTimeOffset? endDate = null)
        {
            var currentUser = User.GetCurrentUser();
            if (currentUser == null)
            {
                return Unauthorized();
            }

            // Kiểm tra quyền truy cập ví (chỉ được xem ví của mình trừ khi là Founder)
            bool isFounder = User.IsInRole("Founder");
            if (!isFounder)
            {
                // TODO: Kiểm tra walletId có thuộc về user hiện tại không
                // Tạm thời cho phép tất cả user xem
            }

            var result = await _transactionService.GetTransactionStatistics(walletId, startDate, endDate);
            return Ok(result);
        }

        /// <summary>
        /// Lấy lịch sử số dư ví
        /// </summary>
        /// <param name="walletId">ID ví</param>
        /// <param name="startDate">Ngày bắt đầu (optional)</param>
        /// <param name="endDate">Ngày kết thúc (optional)</param>
        /// <returns>Lịch sử số dư ví</returns>
        [HttpGet("BalanceHistory/{walletId}")]
        [Authorize(Roles = "Transaction.GetBalanceHistory")]
        public async Task<IActionResult> GetBalanceHistory(int walletId, [FromQuery] DateTimeOffset? startDate = null, [FromQuery] DateTimeOffset? endDate = null)
        {
            var currentUser = User.GetCurrentUser();
            if (currentUser == null)
            {
                return Unauthorized();
            }

            // Kiểm tra quyền truy cập ví (chỉ được xem ví của mình trừ khi là Founder)
            bool isFounder = User.IsInRole("Founder");
            if (!isFounder)
            {
                // TODO: Kiểm tra walletId có thuộc về user hiện tại không
                // Tạm thời cho phép tất cả user xem
            }

            var result = await _transactionService.GetWalletBalanceHistory(walletId, startDate, endDate);
            return Ok(result);
        }
    }
}