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ý tài khoản ngân hàng
    /// </summary>
    [ApiController]
    [Route("api/[controller]")]
    [Authorize]
    public class BankAccountController : ControllerBase
    {
        private readonly IBankAccountService _bankAccountService;

        public BankAccountController(IBankAccountService bankAccountService)
        {
            _bankAccountService = bankAccountService;
        }

        /// <summary>
        /// Tìm kiếm tài khoản ngân hàng
        /// </summary>
        /// <param name="param">Tham số tìm kiếm</param>
        /// <returns>Danh sách tài khoản ngân hàng</returns>
        [HttpPost("Search")]
        [Authorize(Roles = "BankAccount.Search")]
        public async Task<IActionResult> Search([FromBody] SmartTableParam param)
        {
            try
            {
                var result = await _bankAccountService.Search(param);
                return Ok(result);
            }
            catch (Exception ex)
            {
                return StatusCode(500, new { message = $"Lỗi hệ thống: {ex.Message}" });
            }
        }

        /// <summary>
        /// Lấy chi tiết tài khoản ngân hàng
        /// </summary>
        /// <param name="id">ID tài khoản ngân hàng</param>
        /// <returns>Chi tiết tài khoản ngân hàng</returns>
        [HttpGet("{id}")]
        [Authorize(Roles = "BankAccount.View")]
        public async Task<IActionResult> GetById(int id)
        {
            try
            {
                var result = await _bankAccountService.GetById(id);
                return Ok(result);
            }
            catch (ArgumentException ex)
            {
                return NotFound(new { message = ex.Message });
            }
            catch (Exception ex)
            {
                return StatusCode(500, new { message = $"Lỗi hệ thống: {ex.Message}" });
            }
        }

        /// <summary>
        /// Tạo hoặc cập nhật tài khoản ngân hàng
        /// </summary>
        /// <param name="model">Thông tin tài khoản ngân hàng</param>
        /// <returns>Kết quả thao tác</returns>
        [HttpPost("CreateOrUpdate")]
        [Authorize(Roles = "BankAccount.CreateOrUpdate")]
        public async Task<IActionResult> CreateOrUpdate([FromBody] BankAccountModel model)
        {
            try
            {
                var currentUser = User.GetCurrentUser();
                if (currentUser == null)
                    return Unauthorized(new { message = "Không thể xác định người dùng hiện tại" });

                if (!ModelState.IsValid)
                    return BadRequest(ModelState);

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

                var result = await _bankAccountService.CreateOrUpdate(model);
                return Ok(result);
            }
            catch (Exception ex)
            {
                return StatusCode(500, new { message = $"Lỗi hệ thống: {ex.Message}" });
            }
        }

        /// <summary>
        /// Xóa tài khoản ngân hàng
        /// </summary>
        /// <param name="id">ID tài khoản ngân hàng</param>
        /// <returns>Kết quả thao tác</returns>
        [HttpDelete("{id}")]
        [Authorize(Roles = "BankAccount.Delete")]
        public async Task<IActionResult> Delete(int id)
        {
            try
            {
                var result = await _bankAccountService.Delete(id);
                return Ok(result);
            }
            catch (Exception ex)
            {
                return StatusCode(500, new { message = $"Lỗi hệ thống: {ex.Message}" });
            }
        }

        /// <summary>
        /// Import sao kê ngân hàng từ file Excel
        /// </summary>
        /// <param name="model">Thông tin import</param>
        /// <returns>Kết quả import</returns>
        [HttpPost("ImportStatement")]
        [Authorize(Roles = "BankAccount.ImportStatement")]
        public async Task<IActionResult> ImportStatement([FromForm] BankStatementImportModel model)
        {
            try
            {
                var currentUser = User.GetCurrentUser();
                if (currentUser == null)
                    return Unauthorized(new { message = "Không thể xác định người dùng hiện tại" });

                if (!ModelState.IsValid)
                    return BadRequest(ModelState);

                var result = await _bankAccountService.ImportBankStatement(model, currentUser.UserId, currentUser.UserName);
                return Ok(result);
            }
            catch (Exception ex)
            {
                return StatusCode(500, new { message = $"Lỗi hệ thống: {ex.Message}" });
            }
        }

        /// <summary>
        /// Tìm kiếm giao dịch ngân hàng
        /// </summary>
        /// <param name="param">Tham số tìm kiếm</param>
        /// <returns>Danh sách giao dịch</returns>
        [HttpPost("SearchTransactions")]
        [Authorize(Roles = "BankAccount.SearchTransactions")]
        public async Task<IActionResult> SearchTransactions([FromBody] SmartTableParam param)
        {
            try
            {
                var result = await _bankAccountService.SearchTransactions(param);
                return Ok(result);
            }
            catch (Exception ex)
            {
                return StatusCode(500, new { message = $"Lỗi hệ thống: {ex.Message}" });
            }
        }

        /// <summary>
        /// Lấy danh sách tài khoản ngân hàng đang hoạt động
        /// </summary>
        /// <returns>Danh sách tài khoản đang hoạt động</returns>
        [HttpGet("GetActiveAccounts")]
        [Authorize(Roles = "BankAccount.View")]
        public async Task<IActionResult> GetActiveAccounts()
        {
            try
            {
                var result = await _bankAccountService.GetActiveAccounts();
                return Ok(result);
            }
            catch (Exception ex)
            {
                return StatusCode(500, new { message = $"Lỗi hệ thống: {ex.Message}" });
            }
        }

        /// <summary>
        /// Tìm kiếm lịch sử import sao kê
        /// </summary>
        /// <param name="param">Tham số tìm kiếm</param>
        /// <returns>Danh sách lịch sử import</returns>
        [HttpPost("SearchImportHistory")]
        [Authorize(Roles = "BankAccount.SearchImportHistory")]
        public async Task<IActionResult> SearchImportHistory([FromBody] SmartTableParam param)
        {
            try
            {
                var result = await _bankAccountService.SearchImportHistory(param);
                return Ok(result);
            }
            catch (Exception ex)
            {
                return StatusCode(500, new { message = $"Lỗi hệ thống: {ex.Message}" });
            }
        }

        /// <summary>
        /// Cập nhật số dư tài khoản
        /// </summary>
        /// <param name="accountId">ID tài khoản</param>
        /// <param name="newBalance">Số dư mới</param>
        /// <returns>Kết quả thao tác</returns>
        [HttpPut("UpdateBalance")]
        [Authorize(Roles = "BankAccount.UpdateBalance")]
        public async Task<IActionResult> UpdateBalance([FromBody] UpdateBalanceModel model)
        {
            try
            {
                if (!ModelState.IsValid)
                    return BadRequest(ModelState);

                var result = await _bankAccountService.UpdateBalance(model.AccountId, model.NewBalance);
                return Ok(result);
            }
            catch (Exception ex)
            {
                return StatusCode(500, new { message = $"Lỗi hệ thống: {ex.Message}" });
            }
        }

    }

    /// <summary>
    /// Model cập nhật số dư
    /// </summary>
    public class UpdateBalanceModel
    {
        /// <summary>
        /// ID tài khoản
        /// </summary>
        public int AccountId { get; set; }

        /// <summary>
        /// Số dư mới
        /// </summary>
        public decimal NewBalance { get; set; }
    }
}
