using Lada.Framework.DTO;
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ý thông tin ngân hàng
    /// </summary>
    [ApiController]
    [Route("api/[controller]")]
    [Authorize]
    public class BankController : ControllerBase
    {
        private readonly IBankService _bankService;
        private readonly BankSeedService _bankSeedService;
        private readonly ILogger<BankController> _logger;

        public BankController(
            IBankService bankService,
            BankSeedService bankSeedService,
            ILogger<BankController> logger)
        {
            _bankService = bankService;
            _bankSeedService = bankSeedService;
            _logger = logger;
        }

        /// <summary>
        /// Tìm kiếm ngân hàng với phân trang
        /// </summary>
        [HttpPost("Search")]
        public async Task<IActionResult> Search([FromBody] SmartTableParam param)
        {
            try
            {
                var result = await _bankService.Search(param);
                return Ok(result);
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Error occurred while searching banks");
                return BadRequest(new BaseResult
                {
                    Result = Result.SystemError,
                    Message = "Có lỗi xảy ra khi tìm kiếm ngân hàng"
                });
            }
        }

        /// <summary>
        /// Lấy danh sách tất cả ngân hàng đang hoạt động
        /// </summary>
        [HttpGet("GetAll")]
        public async Task<IActionResult> GetAll()
        {
            try
            {
                var banks = await _bankService.GetAll();
                return Ok(new { Success = true, Data = banks });
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Error occurred while getting banks");
                return BadRequest(new BaseResult
                {
                    Result = Result.SystemError,
                    Message = "Có lỗi xảy ra khi lấy danh sách ngân hàng"
                });
            }
        }

        /// <summary>
        /// Khởi tạo dữ liệu ngân hàng mẫu
        /// </summary>
        [HttpPost("InitializeBankData")]
        [AllowAnonymous]
        public async Task<IActionResult> InitializeBankData()
        {
            try
            {
                await _bankSeedService.SeedBankDataAsync();
                return Ok(new BaseResult
                {
                    Result = Result.Success,
                    Message = "Dữ liệu ngân hàng đã được khởi tạo thành công"
                });
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Error occurred while initializing bank data");
                return BadRequest(new BaseResult
                {
                    Result = Result.SystemError,
                    Message = "Có lỗi xảy ra khi khởi tạo dữ liệu ngân hàng: " + ex.Message
                });
            }
        }

        /// <summary>
        /// Lấy thông tin ngân hàng theo ID (trả về model để edit)
        /// </summary>
        [HttpGet("GetById/{id}")]
        public async Task<IActionResult> GetById(int id)
        {
            try
            {
                var bank = await _bankService.GetById(id);
                if (bank == null)
                {
                    return NotFound(new BaseResult
                    {
                        Result = Result.Failed,
                        Message = "Không tìm thấy ngân hàng"
                    });
                }

                return Ok(bank);
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Error occurred while getting bank by id: {Id}", id);
                return BadRequest(new BaseResult
                {
                    Result = Result.SystemError,
                    Message = "Có lỗi xảy ra khi lấy thông tin ngân hàng"
                });
            }
        }

        /// <summary>
        /// Tạo hoặc cập nhật thông tin ngân hàng
        /// </summary>
        [HttpPost("CreateOrUpdate")]
        [Authorize(Roles = "Bank.CreateOrUpdate")]
        public async Task<IActionResult> CreateOrUpdate([FromBody] BankModel model)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

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

            try
            {
                var result = await _bankService.CreateOrUpdate(model);
                return Ok(result);
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Error occurred while creating or updating bank");
                return BadRequest(new BaseResult
                {
                    Result = Result.SystemError,
                    Message = "Có lỗi xảy ra khi tạo/cập nhật ngân hàng"
                });
            }
        }

        /// <summary>
        /// Tạo ngân hàng mới
        /// </summary>
        [HttpPost("Create")]
        public async Task<IActionResult> Create([FromBody] BankModel model)
        {
            try
            {
                if (!ModelState.IsValid)
                {
                    return BadRequest(new BaseResult
                    {
                        Result = Result.Failed,
                        Message = "Dữ liệu không hợp lệ"
                    });
                }

                var result = await _bankService.Create(model);
                return Ok(result);
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Error occurred while creating bank");
                return BadRequest(new BaseResult
                {
                    Result = Result.SystemError,
                    Message = "Có lỗi xảy ra khi tạo ngân hàng"
                });
            }
        }

        /// <summary>
        /// Cập nhật thông tin ngân hàng
        /// </summary>
        [HttpPut("Update")]
        public async Task<IActionResult> Update([FromBody] BankModel model)
        {
            try
            {
                if (!ModelState.IsValid)
                {
                    return BadRequest(new BaseResult
                    {
                        Result = Result.Failed,
                        Message = "Dữ liệu không hợp lệ"
                    });
                }

                var result = await _bankService.Update(model);
                return Ok(result);
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Error occurred while updating bank");
                return BadRequest(new BaseResult
                {
                    Result = Result.SystemError,
                    Message = "Có lỗi xảy ra khi cập nhật ngân hàng"
                });
            }
        }

        /// <summary>
        /// Xóa ngân hàng
        /// </summary>
        [HttpDelete("Delete/{id}")]
        public async Task<IActionResult> Delete(int id)
        {
            try
            {
                var result = await _bankService.Delete(id);
                return Ok(result);
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Error occurred while deleting bank: {Id}", id);
                return BadRequest(new BaseResult
                {
                    Result = Result.SystemError,
                    Message = "Có lỗi xảy ra khi xóa ngân hàng"
                });
            }
        }

        /// <summary>
        /// Gợi ý ngân hàng theo từ khóa (cho select option)
        /// </summary>
        [HttpGet("SugBank")]
        [AllowAnonymous]
        public async Task<IActionResult> SugBank([FromQuery] string keyword = "", [FromQuery] int limit = 20)
        {
            try
            {
                var banks = await _bankService.SugBank(keyword, limit);
                return Ok(banks);
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Error occurred while suggesting banks");
                return BadRequest(new BaseResult
                {
                    Result = Result.SystemError,
                    Message = "Có lỗi xảy ra khi gợi ý ngân hàng"
                });
            }
        }


    }
}
