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

namespace Ladaer.BackEnd.Controllers.Crm
{
    /// <summary>
    /// Controller quản lý tài khoản ngân hàng khách hàng
    /// </summary>
    [ApiController]
    [Route("api/[controller]")]
    [Authorize]
    public class CustomerBankAccountController : ControllerBase
    {
        private readonly ICustomerBankAccountService _customerBankAccountService;

        /// <summary>
        /// Khởi tạo controller
        /// </summary>
        /// <param name="customerBankAccountService">Service quản lý tài khoản ngân hàng</param>
        public CustomerBankAccountController(ICustomerBankAccountService customerBankAccountService)
        {
            _customerBankAccountService = customerBankAccountService;
        }

        /// <summary>
        /// Lấy danh sách tài khoản ngân hàng của khách hàng
        /// </summary>
        /// <param name="customerId">ID khách hàng</param>
        /// <returns>Danh sách tài khoản ngân hàng</returns>
        [HttpGet("GetByCustomerId/{customerId}")]
        [Authorize(Roles = "CustomerBankAccount.View")]
        public async Task<IActionResult> GetByCustomerId(int customerId)
        {
            if (customerId <= 0)
            {
                return BadRequest("ID khách hàng không hợp lệ");
            }

            var result = await _customerBankAccountService.GetByCustomerId(customerId);
            return Ok(result);
        }

        /// <summary>
        /// Lấy tài khoản ngân hàng mặc định của khách hàng
        /// </summary>
        /// <param name="customerId">ID khách hàng</param>
        /// <returns>Tài khoản ngân hàng mặc định</returns>
        [HttpGet("GetDefaultByCustomerId/{customerId}")]
        [Authorize(Roles = "CustomerBankAccount.View")]
        public async Task<IActionResult> GetDefaultByCustomerId(int customerId)
        {
            if (customerId <= 0)
            {
                return BadRequest("ID khách hàng không hợp lệ");
            }

            var result = await _customerBankAccountService.GetDefaultByCustomerId(customerId);
            return Ok(result);
        }

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

            var result = await _customerBankAccountService.GetById(id);
            if (result.Id <= 0)
            {
                return NotFound("Không tìm thấy tài khoản ngân hàng");
            }

            return Ok(result);
        }

        /// <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 = "CustomerBankAccount.Create,CustomerBankAccount.Update")]
        public async Task<IActionResult> CreateOrUpdate([FromBody] CustomerBankAccountModel model)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

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

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

            // Validate model
            var validationErrors = model.Validate();
            if (validationErrors.Any())
            {
                return BadRequest(string.Join("; ", validationErrors));
            }

            var result = await _customerBankAccountService.CreateOrUpdate(model);
            return Ok(result);
        }

        /// <summary>
        /// Xóa tài khoản ngân hàng
        /// </summary>
        /// <param name="id">ID tài khoản</param>
        /// <returns>Kết quả thao tác</returns>
        [HttpDelete("{id}")]
        [Authorize(Roles = "CustomerBankAccount.Delete")]
        public async Task<IActionResult> Delete(int id)
        {
            if (id <= 0)
            {
                return BadRequest("ID tài khoản không hợp lệ");
            }

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

            var result = await _customerBankAccountService.Delete(id, currentUser);
            return Ok(result);
        }

        /// <summary>
        /// Đặt tài khoản làm mặc định
        /// </summary>
        /// <param name="id">ID tài khoản</param>
        /// <returns>Kết quả thao tác</returns>
        [HttpPut("SetDefault/{id}")]
        [Authorize(Roles = "CustomerBankAccount.Update")]
        public async Task<IActionResult> SetDefault(int id)
        {
            if (id <= 0)
            {
                return BadRequest("ID tài khoản không hợp lệ");
            }

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

            var result = await _customerBankAccountService.SetDefault(id, currentUser);
            return Ok(result);
        }

        /// <summary>
        /// Tìm kiếm tài khoản ngân hàng
        /// </summary>
        /// <param name="keyword">Từ khóa tìm kiếm (số TK, tên chủ TK, tên ngân hàng)</param>
        /// <param name="customerId">ID khách hàng (tùy chọn)</param>
        /// <param name="bankCode">Mã ngân hàng (tùy chọn)</param>
        /// <returns>Danh sách tài khoản ngân hàng</returns>
        [HttpPost("Search")]
        [Authorize(Roles = "CustomerBankAccount.View")]
        public async Task<IActionResult> Search([FromBody] SmartTableParam param)
        {
            var result = await _customerBankAccountService.Search(param);
            return Ok(result);
        }

        /// <summary>
        /// Gợi ý tài khoản ngân hàng cho khách hàng
        /// </summary>
        /// <param name="customerId">ID khách hàng</param>
        /// <param name="keyword">Từ khóa tìm kiếm</param>
        /// <returns>Danh sách gợi ý</returns>
        [HttpGet("Suggest")]
        [Authorize(Roles = "CustomerBankAccount.View")]
        public async Task<IActionResult> Suggest([FromQuery] int customerId, [FromQuery] string? keyword = null)
        {
            if (customerId <= 0)
            {
                return BadRequest("ID khách hàng không hợp lệ");
            }

            var result = await _customerBankAccountService.Suggest(customerId, keyword);
            return Ok(result);
        }
    }
}
