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 cá nhân của người dùng đang đăng nhập
    /// </summary>
    [Route("api/[controller]")]
    [ApiController]
    [Authorize]
    public class MyBankAccountController : ControllerBase
    {
        private readonly IUserBankAccountService _userBankAccountService;

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

        /// <summary>
        /// Lấy danh sách tài khoản ngân hàng của tôi
        /// </summary>
        /// <returns>Danh sách tài khoản ngân hàng</returns>
        [HttpGet("GetAll")]
        public async Task<IActionResult> GetAll()
        {
            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}");
            }
        }

        /// <summary>
        /// Tìm kiếm tài khoản ngân hàng của tôi 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 với phân trang</returns>
        [HttpPost("Search")]
        public async Task<IActionResult> Search([FromBody] SmartTableParam param)
        {
            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.SearchByUserId(param, currentUser.UserId);
                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 của tôi 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("{id}")]
        public async Task<IActionResult> GetById(int id)
        {
            try
            {
                if (id <= 0)
                {
                    return BadRequest("ID không hợp lệ");
                }

                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.GetByIdAndUserId(id, currentUser.UserId);
                if (result == null)
                {
                    return NotFound("Không tìm thấy tài khoản ngân hàng");
                }

                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 của tôi
        /// </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")]
        public async Task<IActionResult> CreateOrUpdate([FromBody] UserBankAccountModel model)
        {
            try
            {
                if (!ModelState.IsValid)
                {
                    return BadRequest(ModelState);
                }

                var currentUser = User.GetCurrentUser();
                if (currentUser == null || currentUser.UserId <= 0)
                {
                    return BadRequest("Không xác định được người dùng");
                }

                // Nếu đang cập nhật, kiểm tra quyền sở hữu
                if (model.Id > 0)
                {
                    var existingAccount = await _userBankAccountService.GetByIdAndUserId(model.Id, currentUser.UserId);
                    if (existingAccount == null)
                    {
                        return BadRequest("Không tìm thấy tài khoản ngân hàng hoặc bạn không có quyền chỉnh sửa");
                    }
                    
                    // Cập nhật
                    model.UserId = currentUser.UserId; // Đảm bảo UserId không bị thay đổi
                    model.UpdatedBy = currentUser.UserId;
                    model.UpdatedByUserName = currentUser.UserName;
                }
                else
                {
                    // Tạo mới
                    model.UserId = currentUser.UserId;
                    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 của tôi
        /// </summary>
        /// <param name="id">ID tài khoản ngân hàng</param>
        /// <returns>Kết quả xóa</returns>
        [HttpDelete("{id}")]
        public async Task<IActionResult> Delete(int id)
        {
            try
            {
                if (id <= 0)
                {
                    return BadRequest("ID không hợp lệ");
                }

                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.DeleteByIdAndUserId(
                    id, 
                    currentUser.UserId, 
                    currentUser.UserId, 
                    currentUser.UserName);

                if (result.Result == Lada.Framework.DTO.Result.Success)
                {
                    return Ok(result);
                }
                else
                {
                    return BadRequest(result);
                }
            }
            catch (Exception ex)
            {
                return StatusCode(500, $"Lỗi hệ thống: {ex.Message}");
            }
        }
    }
}
