using Lada.Framework.DTO.SmartTable;
using Lada.Framework.Infrastructures.Helpers;
using Ladaer.BackEnd.Infrastructures.DTO.Models.Finance;
using Ladaer.BackEnd.Infrastructures.Services.Finance;
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 người dùng
    /// </summary>
    [Route("api/[controller]")]
    [ApiController]
    [Authorize]
    public class UserBankAccountController : ControllerBase
    {
        private readonly IUserBankAccountService _userBankAccountService;

        public UserBankAccountController(IUserBankAccountService userBankAccountService)
        {
            _userBankAccountService = userBankAccountService;
        }

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

        /// <summary>
        /// Lấy thông tin chi tiết tài khoản ngân hàng theo ID
        /// </summary>
        /// <param name="id">ID tài khoản ngân hàng</param>
        /// <returns>Thông tin chi tiết tài khoản ngân hàng</returns>
        [HttpGet("GetById")]
        [Authorize(Roles = "UserBankAccount.GetById")]
        public async Task<IActionResult> GetById(int id)
        {
            try
            {
                if (id <= 0)
                {
                    return BadRequest("ID không hợp lệ");
                }

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

        /// <summary>
        /// Tạo mới 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ả tạo hoặc cập nhật</returns>
        [HttpPost("CreateOrUpdate")]
        [Authorize(Roles = "UserBankAccount.CreateOrUpdate")]
        public async Task<IActionResult> CreateOrUpdate([FromBody] UserBankAccountModel model)
        {
            try
            {
                var currentUser = User.GetCurrentUser();
                if (currentUser == null || currentUser.UserId <= 0)
                {
                    return BadRequest("Không xác định được người dùng");
                }

                // Set thông tin người dùng
                if (model.UserId > 0)
                {
                    // Cập nhật
                    model.UpdatedBy = currentUser.UserId;
                    model.UpdatedByUserName = currentUser.UserName;
                }
                else
                {
                    // Tạo mới
                    model.UserId = currentUser.UserId; // Tự động set UserId cho user hiện tại
                    model.CreatedBy = currentUser.UserId;
                    model.CreatedByUserName = currentUser.UserName;
                }

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

        /// <summary>
        /// Xóa tài khoản ngân hàng
        /// </summary>
        /// <param name="model">Thông tin tài khoản ngân hàng cần xóa</param>
        /// <returns>Kết quả xóa</returns>
        [HttpPost("Delete")]
        [Authorize(Roles = "UserBankAccount.Delete")]
        public async Task<IActionResult> Delete([FromBody] UserBankAccountModel model)
        {
            try
            {
                var currentUser = User.GetCurrentUser();
                if (currentUser == null || currentUser.UserId <= 0)
                {
                    return BadRequest("Không xác định được người dùng");
                }

                if (model.Id <= 0)
                {
                    return BadRequest("ID không hợp lệ");
                }

                // Set thông tin người dùng
                model.UpdatedBy = currentUser.UserId;
                model.UpdatedByUserName = currentUser.UserName;

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

        /// <summary>
        /// Lấy danh sách tài khoản ngân hàng của người dùng hiện tại
        /// </summary>
        /// <returns>Danh sách tài khoản ngân hàng</returns>
        [HttpGet("GetMyBankAccounts")]
        public async Task<IActionResult> GetMyBankAccounts()
        {
            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 _userBankAccountService.GetByUserId(currentUser.UserId);
                return Ok(result);
            }
            catch (Exception ex)
            {
                return StatusCode(500, $"Lỗi hệ thống: {ex.Message}");
            }
        }
    }
}