using Lada.Framework.DTO;
using Lada.Framework.DTO.SmartTable;
using Lada.Framework.Infrastructures;
using Lada.Framework.Infrastructures.Helpers;
using Ladaer.BackEnd.Infrastructures.DTO.Items.Finance;
using Ladaer.BackEnd.Infrastructures.DTO.Models.Finance;
using Ladaer.BackEnd.Infrastructures.DTO.Results.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ý hóa đơn thanh toán chuyển khoản
    /// </summary>
    [ApiController]
    [Route("api/[controller]")]
    [Authorize]
    public class TransferPaymentBillController : ControllerBase
    {
        private readonly ITransferPaymentBillService _transferPaymentBillService;
        private readonly ITransferPaymentBillExcelService _transferPaymentBillExcelService;

        public TransferPaymentBillController(
            ITransferPaymentBillService transferPaymentBillService,
            ITransferPaymentBillExcelService transferPaymentBillExcelService)
        {
            _transferPaymentBillService = transferPaymentBillService;
            _transferPaymentBillExcelService = transferPaymentBillExcelService;
        }

        #region Search Operations

        /// <summary>
        /// Tìm kiếm khách hàng có đơn hàng cần tạo hóa đơn thanh toán chuyển khoản
        /// </summary>
        /// <param name="param">Tham số tìm kiếm</param>
        /// <returns>Danh sách khách hàng</returns>
        [HttpPost("SearchCustomersForTransferPayment")]
        [Authorize(Roles = "TransferPaymentBill.SearchCustomers")]
        public async Task<IActionResult> SearchCustomersForTransferPayment([FromBody] SmartTableParam param)
        {
            var currentUser = User.GetCurrentUser();
            if (currentUser == null)
            {
                return Unauthorized();
            }

            var result = await _transferPaymentBillService.SearchCustomersForTransferPayment(param, currentUser);
            return Ok(result);
        }

        /// <summary>
        /// Lấy danh sách đơn hàng có thể tạo hóa đơn thanh toán của khách hàng
        /// </summary>
        /// <param name="customerId">ID khách hàng</param>
        /// <returns>Danh sách đơn hàng</returns>
        [HttpGet("GetTransferableOrdersByCustomer")]
        [Authorize(Roles = "TransferPaymentBill.GetTransferableOrders")]
        public async Task<IActionResult> GetTransferableOrdersByCustomer(
            [FromQuery] int customerId)
        {
            var currentUser = User.GetCurrentUser();
            if (currentUser == null)
            {
                return Unauthorized();
            }

            var result = await _transferPaymentBillService.GetTransferableOrdersByCustomer(
                customerId, currentUser);
            return Ok(result);
        }

        /// <summary>
        /// Tìm kiếm danh sách hóa đơn thanh toán chuyển khoản
        /// </summary>
        /// <param name="param">Tham số tìm kiếm</param>
        /// <returns>Danh sách hóa đơn</returns>
        [HttpPost("Search")]
        [Authorize(Roles = "TransferPaymentBill.Search")]
        public async Task<IActionResult> Search([FromBody] SmartTableParam param)
        {
            var currentUser = User.GetCurrentUser();
            if (currentUser == null)
            {
                return Unauthorized();
            }

            var result = await _transferPaymentBillService.Search(param, currentUser);
            return Ok(result);
        }

        #endregion

        #region CRUD Operations

        /// <summary>
        /// Lấy chi tiết hóa đơn thanh toán theo ID
        /// </summary>
        /// <param name="id">ID hóa đơn</param>
        /// <returns>Chi tiết hóa đơn</returns>
        [HttpGet("GetById/{id}")]
        [Authorize(Roles = "TransferPaymentBill.GetById")]
        public async Task<IActionResult> GetById(int id)
        {
            var currentUser = User.GetCurrentUser();
            if (currentUser == null)
            {
                return Unauthorized();
            }

            var result = await _transferPaymentBillService.GetById(id, currentUser);
            if (result == null)
            {
                return NotFound("Không tìm thấy hóa đơn hoặc bạn không có quyền xem");
            }

            return Ok(result);
        }

        /// <summary>
        /// Tạo hóa đơn thanh toán chuyển khoản
        /// </summary>
        /// <param name="model">Thông tin hóa đơn</param>
        /// <returns>Kết quả tạo hóa đơn</returns>
        [HttpPost("Create")]
        [Authorize(Roles = "TransferPaymentBill.Create")]
        public async Task<IActionResult> Create([FromForm] CreateTransferPaymentBillModel model)
        {
            var currentUser = User.GetCurrentUser();
            if (currentUser == null)
            {
                return Unauthorized();
            }

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

            var result = await _transferPaymentBillService.Create(model, currentUser);
            return Ok(result);
        }

        /// <summary>
        /// Hủy hóa đơn thanh toán chuyển khoản với thông tin chi tiết
        /// </summary>
        /// <param name="model">Thông tin hủy hóa đơn</param>
        /// <returns>Kết quả hủy hóa đơn</returns>
        [HttpPost("Cancel")]
        [Authorize(Roles = "TransferPaymentBill.Cancel")]
        public async Task<IActionResult> Cancel([FromBody] CancelTransferPaymentBillModel model)
        {
            if (model == null)
            {
                return BadRequest("Thông tin hủy hóa đơn không được để trống");
            }

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

            // Set thông tin người hủy từ current user
            model.CancelledBy = currentUser.UserId;
            model.CancelledByUsername = currentUser.UserName;
            model.CancelledTime = DateTimeOffset.UtcNow;

            var result = await _transferPaymentBillService.Cancel(model);
            return Ok(result);
        }

        /// <summary>
        /// Hủy hóa đơn thanh toán chuyển khoản (phương thức cũ - deprecated)
        /// </summary>
        /// <param name="id">ID hóa đơn</param>
        /// <returns>Kết quả hủy hóa đơn</returns>
        [HttpPost("Cancel/{id}")]
        [Authorize(Roles = "TransferPaymentBill.Cancel")]
        [Obsolete("Sử dụng Cancel([FromBody] CancelTransferPaymentBillModel model) thay thế")]
        public async Task<IActionResult> Cancel(int id)
        {
            if (id <= 0)
            {
                return BadRequest("ID hóa đơ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 _transferPaymentBillService.Cancel(id, currentUser);
            return Ok(result);
        }

        /// <summary>
        /// Duyệt hóa đơn thanh toán chuyển khoản
        /// </summary>
        /// <param name="model">Thông tin duyệt hóa đơn</param>
        /// <returns>Kết quả duyệt hóa đơn</returns>
        [HttpPost("Approve")]
        [Authorize(Roles = "TransferPaymentBill.Approve")]
        public async Task<IActionResult> Approve([FromBody] ApproveTransferPaymentBillModel model)
        {
            var currentUser = User.GetCurrentUser();
            if (currentUser == null)
            {
                return Unauthorized();
            }

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

            var result = await _transferPaymentBillService.Approve(model, currentUser);
            return Ok(result);
        }

        #endregion

        #region Excel Export

        /// <summary>
        /// Xuất Excel danh sách phiếu chuyển khoản
        /// </summary>
        /// <param name="model">Model xuất Excel</param>
        /// <returns>Kết quả xuất file</returns>
        [HttpPost("ExportExcel")]
        [Authorize(Roles = "TransferPaymentBill.ExportExcel")]
        public async Task<IActionResult> ExportExcel([FromBody] TransferPaymentBillExcelExportModel model)
        {
            try
            {
                var currentUser = User.GetCurrentUser();
                if (currentUser == null)
                {
                    return Unauthorized("Không xác định được người dùng");
                }

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

                // Set thông tin người tạo
                model.UpdatedBy = currentUser.UserId;
                model.UpdatedByUserName = currentUser.UserName;

                // TODO: Inject ITransferPaymentBillExcelService và gọi method export
                // var result = await _transferPaymentBillExcelService.ExportTransferPaymentBillsAsync(model);

                // Tạm thời trả về response mẫu
                var result = new TransferPaymentBillExcelExportResult
                {
                    Result = Result.Success,
                    Message = "Chức năng xuất Excel đang được phát triển",
                    FileName = "DanhSachPhieuChuyenKhoan.xlsx",
                    TotalRecords = 0
                };

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

        /// <summary>
        /// Xuất Excel chi tiết phiếu chuyển khoản
        /// </summary>
        /// <param name="transferPaymentBillId">ID phiếu chuyển khoản</param>
        /// <param name="model">Model xuất Excel</param>
        /// <returns>Kết quả xuất file</returns>
        [HttpPost("ExportExcelDetail/{transferPaymentBillId}")]
        [Authorize(Roles = "TransferPaymentBill.ExportExcel")]
        public async Task<IActionResult> ExportExcelDetail(int transferPaymentBillId, [FromBody] TransferPaymentBillExcelExportModel model)
        {
            try
            {
                if (transferPaymentBillId <= 0)
                {
                    return BadRequest("ID phiếu chuyển khoản không hợp lệ");
                }

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

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

                // Set thông tin người tạo
                model.UpdatedBy = currentUser.UserId;
                model.UpdatedByUserName = currentUser.UserName;

                // TODO: Inject ITransferPaymentBillExcelService và gọi method export detail
                // var result = await _transferPaymentBillExcelService.ExportTransferPaymentBillDetailAsync(transferPaymentBillId, model);

                // Tạm thời trả về response mẫu
                var result = new TransferPaymentBillExcelExportResult
                {
                    Result = Result.Success,
                    Message = "Chức năng xuất Excel chi tiết đang được phát triển",
                    FileName = $"ChiTietPhieuChuyenKhoan_{transferPaymentBillId}.xlsx",
                    TotalRecords = 1
                };

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

        
        #endregion
    }
}
