using Lada.Framework.DTO;
using Lada.Framework.Data.Repositories;
using Lada.Framework.Data.Domains.Finance;
using Lada.Framework.Data.Domains.Crm;
using Lada.Framework.Data.Domains.Orders;
using Lada.Framework.Infrastructures.Services;
using Lada.Framework.Infrastructures.Helpers;
using Lada.Framework.Infrastructures;
using Ladaer.BackEnd.Infrastructures.DTO.Models.Finance;
using Ladaer.BackEnd.Infrastructures.DTO.Results.Finance;
using Ladaer.BackEnd.Infrastructures.DTO.Items.Finance;
using Ladaer.BackEnd.Infrastructures.Services.Finance;
using Microsoft.EntityFrameworkCore;
using OfficeOpenXml;
using OfficeOpenXml.Style;
using System.Drawing;
using System.IO;

namespace Ladaer.BackEnd.Infrastructures.Services.Finance
{
    /// <summary>
    /// Interface cho dịch vụ xuất Excel phiếu chuyển khoản
    /// </summary>
    public interface ITransferPaymentBillExcelService
    {
        /// <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>
        Task<TransferPaymentBillExcelExportResult> ExportTransferPaymentBillsAsync(TransferPaymentBillExcelExportModel model);

        /// <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>
        Task<TransferPaymentBillExcelExportResult> ExportTransferPaymentBillDetailAsync(int transferPaymentBillId, TransferPaymentBillExcelExportModel model);

        /// <summary>
        /// Xuất Excel danh sách đơn hàng nợ cước của khách hàng
        /// </summary>
        /// <param name="model">Model xuất Excel</param>
        /// <returns>Kết quả xuất file</returns>
        Task<TransferPaymentBillExcelExportResult> ExportCustomerTransferableOrdersAsync(CustomerTransferableOrdersExcelExportModel model);
    }

    /// <summary>
    /// Dịch vụ xuất Excel phiếu chuyển khoản
    /// </summary>
    public class TransferPaymentBillExcelService : ITransferPaymentBillExcelService
    {
        private readonly ITransferPaymentBillService _transferPaymentBillService;
        private readonly IRepository<TransferPaymentBill> _transferPaymentBillRepository;
        private readonly IRepository<TransferPaymentBillOrder> _transferPaymentBillOrderRepository;
        private readonly IRepository<Customer> _customerRepository;
        private readonly IRepository<Order> _orderRepository;
        private readonly IExcelFileService _excelFileService;

        public TransferPaymentBillExcelService(
            ITransferPaymentBillService transferPaymentBillService,
            IRepository<TransferPaymentBill> transferPaymentBillRepository,
            IRepository<TransferPaymentBillOrder> transferPaymentBillOrderRepository,
            IRepository<Customer> customerRepository,
            IRepository<Order> orderRepository,
            IExcelFileService excelFileService)
        {
            _transferPaymentBillService = transferPaymentBillService;
            _transferPaymentBillRepository = transferPaymentBillRepository;
            _transferPaymentBillOrderRepository = transferPaymentBillOrderRepository;
            _customerRepository = customerRepository;
            _orderRepository = orderRepository;
            _excelFileService = excelFileService;
        }

        /// <summary>
        /// Xuất Excel danh sách phiếu chuyển khoản
        /// </summary>
        public async Task<TransferPaymentBillExcelExportResult> ExportTransferPaymentBillsAsync(TransferPaymentBillExcelExportModel model)
        {
            var result = new TransferPaymentBillExcelExportResult
            {
                ProcessStartTime = DateTimeOffset.Now
            };

            try
            {
                // Validate model
                var validationErrors = model.Validate();
                if (validationErrors.Any())
                {
                    result.Result = Result.Failed;
                    result.Message = string.Join("; ", validationErrors);
                    return result;
                }

                // Lấy dữ liệu phiếu chuyển khoản
                var transferPaymentBills = await GetTransferPaymentBillsDataAsync(model);

                // Tạo file Excel
                var excelPackage = await CreateTransferPaymentBillExcelPackageAsync(transferPaymentBills, model);

                // Tạo tên file
                var fileName = string.IsNullOrEmpty(model.FileName)
                    ? "DanhSachPhieuChuyenKhoan"
                    : model.FileName;

                // Lưu file sử dụng ExcelFileService
                var saveResult = await _excelFileService.SaveExcelFileAsync(
                    excelPackage,
                    fileName,
                    "transfer-payment-bills",
                    model.FolderPath);

                if (saveResult.Result == Result.Success)
                {
                    // Cập nhật kết quả
                    result.FilePath = saveResult.FilePath;
                    result.FileName = saveResult.SavedFileName;
                    result.DownloadUrl = saveResult.FileUrl;
                    result.FileSize = saveResult.FileSize;
                    result.TotalRecords = transferPaymentBills.Count;
                    result.Result = Result.Success;
                    result.Message = "Xuất file Excel thành công";
                }
                else
                {
                    result.Result = saveResult.Result;
                    result.Message = saveResult.Message;
                }
            }
            catch (Exception ex)
            {
                result.Result = Result.SystemError;
                result.Message = $"Lỗi khi xuất file Excel: {ex.Message}";
            }

            result.ProcessEndTime = DateTimeOffset.Now;
            return result;
        }

        /// <summary>
        /// Xuất Excel chi tiết phiếu chuyển khoản
        /// </summary>
        public async Task<TransferPaymentBillExcelExportResult> ExportTransferPaymentBillDetailAsync(int transferPaymentBillId, TransferPaymentBillExcelExportModel model)
        {
            var result = new TransferPaymentBillExcelExportResult
            {
                ProcessStartTime = DateTimeOffset.Now
            };

            try
            {
                // Validate model
                var validationErrors = model.Validate();
                if (validationErrors.Any())
                {
                    result.Result = Result.Failed;
                    result.Message = string.Join("; ", validationErrors);
                    return result;
                }

                // Lấy dữ liệu chi tiết phiếu chuyển khoản
                var transferPaymentBillDetail = await GetTransferPaymentBillDetailDataAsync(transferPaymentBillId);

                if (transferPaymentBillDetail == null)
                {
                    result.Result = Result.Failed;
                    result.Message = "Không tìm thấy phiếu chuyển khoản";
                    return result;
                }

                // Tạo file Excel
                var excelPackage = await CreateTransferPaymentBillDetailExcelPackageAsync(transferPaymentBillDetail, model);

                // Tạo tên file
                var fileName = string.IsNullOrEmpty(model.FileName)
                    ? $"ChiTietPhieuChuyenKhoan_{transferPaymentBillId}"
                    : model.FileName;

                // Lưu file sử dụng ExcelFileService
                var saveResult = await _excelFileService.SaveExcelFileAsync(
                    excelPackage,
                    fileName,
                    "transfer-payment-bills",
                    model.FolderPath);

                if (saveResult.Result == Result.Success)
                {
                    // Cập nhật kết quả
                    result.FilePath = saveResult.FilePath;
                    result.FileName = saveResult.SavedFileName;
                    result.DownloadUrl = saveResult.FileUrl;
                    result.FileSize = saveResult.FileSize;
                    result.TotalRecords = 1;
                    result.Result = Result.Success;
                    result.Message = "Xuất file Excel thành công";
                }
                else
                {
                    result.Result = saveResult.Result;
                    result.Message = saveResult.Message;
                }
            }
            catch (Exception ex)
            {
                result.Result = Result.SystemError;
                result.Message = $"Lỗi khi xuất file Excel: {ex.Message}";
            }

            result.ProcessEndTime = DateTimeOffset.Now;
            return result;
        }

        #region Private Methods

        /// <summary>
        /// Lấy dữ liệu phiếu chuyển khoản
        /// </summary>
        private async Task<List<TransferPaymentBill>> GetTransferPaymentBillsDataAsync(TransferPaymentBillExcelExportModel model)
        {
            var query = _transferPaymentBillRepository.Query()
                .Include(tpb => tpb.Customer)
                .Include(tpb => tpb.Orders)
                    .ThenInclude(tpbo => tpbo.Order)
                    .ThenInclude(o => o.Addresses)
                .Include(tpb => tpb.Orders)
                    .ThenInclude(tpbo => tpbo.Order)
                    .ThenInclude(o => o.Packages)
                .Include(tpb => tpb.Orders)
                    .ThenInclude(tpbo => tpbo.Order)
                    .ThenInclude(o => o.OrderFin)
                .AsQueryable();

            // Filter theo danh sách ID
            if (model.TransferPaymentBillIds != null && model.TransferPaymentBillIds.Any())
            {
                query = query.Where(tpb => model.TransferPaymentBillIds.Contains(tpb.Id));
            }

            // Filter theo ngày
            if (model.FromDate.HasValue)
            {
                query = query.Where(tpb => tpb.CreatedTime >= model.FromDate.Value);
            }

            if (model.ToDate.HasValue)
            {
                query = query.Where(tpb => tpb.CreatedTime <= model.ToDate.Value);
            }

            // Filter theo khách hàng
            if (model.CustomerId.HasValue)
            {
                query = query.Where(tpb => tpb.CustomerId == model.CustomerId.Value);
            }

            // Filter theo trạng thái
            if (model.Status.HasValue)
            {
                query = query.Where(tpb => (int)tpb.Status == model.Status.Value);
            }

            return await query.OrderByDescending(tpb => tpb.CreatedTime).ToListAsync();
        }

        /// <summary>
        /// Lấy dữ liệu chi tiết phiếu chuyển khoản
        /// </summary>
        private async Task<TransferPaymentBill?> GetTransferPaymentBillDetailDataAsync(int transferPaymentBillId)
        {
            return await _transferPaymentBillRepository.Query()
                .Include(tpb => tpb.Customer)
                .Include(tpb => tpb.Orders)
                    .ThenInclude(tpbo => tpbo.Order)
                    .ThenInclude(o => o.Addresses)
                .Include(tpb => tpb.Orders)
                    .ThenInclude(tpbo => tpbo.Order)
                    .ThenInclude(o => o.Packages)
                .Include(tpb => tpb.Orders)
                    .ThenInclude(tpbo => tpbo.Order)
                    .ThenInclude(o => o.OrderFin)
                .Include(tpb => tpb.Transaction)
                .FirstOrDefaultAsync(tpb => tpb.Id == transferPaymentBillId);
        }

        /// <summary>
        /// Tạo ExcelPackage danh sách phiếu chuyển khoản
        /// </summary>
        private Task<ExcelPackage> CreateTransferPaymentBillExcelPackageAsync(List<TransferPaymentBill> transferPaymentBills, TransferPaymentBillExcelExportModel model)
        {
            var package = new ExcelPackage();
            var worksheet = package.Workbook.Worksheets.Add("Danh sách phiếu chuyển khoản");

            // Thiết lập header
            SetupTransferPaymentBillHeaders(worksheet);

            // Điền dữ liệu
            FillTransferPaymentBillData(worksheet, transferPaymentBills);

            // Định dạng worksheet
            FormatTransferPaymentBillWorksheet(worksheet, transferPaymentBills.Count);

            return Task.FromResult(package);
        }

        /// <summary>
        /// Tạo ExcelPackage chi tiết phiếu chuyển khoản
        /// </summary>
        private Task<ExcelPackage> CreateTransferPaymentBillDetailExcelPackageAsync(TransferPaymentBill transferPaymentBillDetail, TransferPaymentBillExcelExportModel model)
        {
            var package = new ExcelPackage();

            // Tạo 1 sheet duy nhất chứa cả thông tin chung và chi tiết đơn hàng
            var worksheet = package.Workbook.Worksheets.Add("Phiếu chuyển khoản chi tiết");

            // Thêm thông tin công ty
            AddCompanyHeader(worksheet);

            // Thông tin chung phiếu chuyển khoản
            AddTransferPaymentBillGeneralInfo(worksheet, transferPaymentBillDetail);

            // Chi tiết đơn hàng
            AddTransferPaymentBillOrdersDetail(worksheet, transferPaymentBillDetail);

            // Định dạng worksheet
            FormatTransferPaymentBillDetailWorksheet(worksheet);

            return Task.FromResult(package);
        }

        /// <summary>
        /// Thêm thông tin công ty vào đầu worksheet
        /// </summary>
        private void AddCompanyHeader(ExcelWorksheet worksheet)
        {
            // Dòng 1: Thông tin công ty với logo (cột A-B)
            var companyCell = worksheet.Cells[1, 1];
            worksheet.Cells[1, 1, 1, 2].Merge = true;
            companyCell.Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
            companyCell.Style.VerticalAlignment = ExcelVerticalAlignment.Center;

            // Thêm logo vào cùng cell với thông tin công ty
            var logoPath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "images", "logo.svg");
            if (File.Exists(logoPath))
            {
                var logo = worksheet.Drawings.AddPicture("Logo", new FileInfo(logoPath));
                logo.SetPosition(0, 5, 0, 100); // Dòng 0, offset 5px từ trên và trái
                logo.SetSize(110, 40); // Kích thước logo 40x40 pixels
            }

            // Tạo rich text với font khác nhau cho thông tin công ty
            var richText = companyCell.RichText.Add("\n\nCÔNG TY TNHH LADA EXPRESS");
            richText.Bold = true;
            richText.Size = 14;

            richText = companyCell.RichText.Add("\nWebsite: https://ladaexpress.vn");
            richText.Bold = false;
            richText.Size = 10;

            richText = companyCell.RichText.Add("\nHotline: 1900.633.658");
            richText.Bold = false;
            richText.Size = 10;

            // Dòng 1: Tiêu đề PHIẾU CHUYỂN KHOẢN (cột D-E)
            var titleCell = worksheet.Cells[1, 3];
            worksheet.Cells[1, 3, 1, 5].Merge = true;
            titleCell.Value = "PHIẾU CHUYỂN KHOẢN";
            titleCell.Style.Font.Bold = true;
            titleCell.Style.Font.Size = 16;
            titleCell.Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
            titleCell.Style.VerticalAlignment = ExcelVerticalAlignment.Center;
        }

        /// <summary>
        /// Thêm thông tin chung phiếu chuyển khoản
        /// </summary>
        private void AddTransferPaymentBillGeneralInfo(ExcelWorksheet worksheet, TransferPaymentBill transferPaymentBill)
        {
            // Dòng 2: Mã phiếu chuyển khoản (cột A-B) và Tổng tiền thu hộ (cột D-E)
            worksheet.Cells[2, 1].Style.VerticalAlignment = ExcelVerticalAlignment.Center;
            worksheet.Cells[2, 1].Value = "Mã phiếu chuyển khoản:";
            worksheet.Cells[2, 2].Value = transferPaymentBill.Code;

            // Dòng 3: Khách hàng (cột A-B) và Tổng cước phí (cột D-E)
            worksheet.Cells[3, 1].Style.VerticalAlignment = ExcelVerticalAlignment.Center;
            worksheet.Cells[3, 1].Value = "Khách hàng:";
            worksheet.Cells[3, 2].Value = transferPaymentBill.Customer?.FullName ?? "";

            worksheet.Cells[3, 4].Style.VerticalAlignment = ExcelVerticalAlignment.Center;
            worksheet.Cells[3, 4].Value = "Tổng cước phí:";
            worksheet.Cells[3, 5].Value = transferPaymentBill.TotalAmount;// TransferPaymentBill không có cước phí riêng
            worksheet.Cells[3, 5].Style.Numberformat.Format = "#,##0 ₫";
        }

        /// <summary>
        /// Thêm chi tiết đơn hàng
        /// </summary>
        private void AddTransferPaymentBillOrdersDetail(ExcelWorksheet worksheet, TransferPaymentBill transferPaymentBill)
        {
            // Dòng 5: Tiêu đề "DANH SÁCH ĐƠN HÀNG"
            worksheet.Cells[5, 1].Value = "DANH SÁCH ĐƠN HÀNG";
            worksheet.Cells[5, 1, 5, 5].Merge = true;
            worksheet.Cells[5, 1].Style.VerticalAlignment = ExcelVerticalAlignment.Center;
            worksheet.Cells[5, 1].Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
            worksheet.Cells[5, 1].Style.Font.Bold = true;
            worksheet.Cells[5, 1].Style.Font.Size = 14;
            worksheet.Cells[5, 1].Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;

            // Dòng 6: Header cho bảng đơn hàng (nền đỏ)
            worksheet.Cells[6, 1].Value = "Mã đơn hàng";
            worksheet.Cells[6, 1].Style.VerticalAlignment = ExcelVerticalAlignment.Center;
            worksheet.Cells[6, 1].Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
            worksheet.Cells[6, 2].Value = "Địa chỉ gửi";
            worksheet.Cells[6, 2].Style.VerticalAlignment = ExcelVerticalAlignment.Center;
            worksheet.Cells[6, 2].Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
            worksheet.Cells[6, 3].Value = "Địa chỉ nhận";
            worksheet.Cells[6, 3].Style.VerticalAlignment = ExcelVerticalAlignment.Center;
            worksheet.Cells[6, 3].Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
            worksheet.Cells[6, 4].Value = "Sản phẩm";
            worksheet.Cells[6, 4].Style.VerticalAlignment = ExcelVerticalAlignment.Center;
            worksheet.Cells[6, 4].Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
            worksheet.Cells[6, 5].Value = "Tài chính";
            worksheet.Cells[6, 5].Style.VerticalAlignment = ExcelVerticalAlignment.Center;
            worksheet.Cells[6, 5].Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;

            int startRow = 7; // Bắt đầu dữ liệu từ dòng 7

            // Dữ liệu đơn hàng
            if (transferPaymentBill.Orders != null && transferPaymentBill.Orders.Any())
            {
                foreach (var transferPaymentBillOrder in transferPaymentBill.Orders)
                {
                    var order = transferPaymentBillOrder.Order;
                    if (order != null)
                    {
                        // Mã đơn hàng
                        worksheet.Cells[startRow, 1].Value = order.Code ?? "";
                        worksheet.Cells[startRow, 1].Style.VerticalAlignment = ExcelVerticalAlignment.Center;
                        // Địa chỉ gửi
                        var senderAddress = GetSenderAddress(order);
                        worksheet.Cells[startRow, 2].Value = senderAddress;
                        worksheet.Cells[startRow, 2].Style.VerticalAlignment = ExcelVerticalAlignment.Center;
                        // Địa chỉ nhận
                        var receiverAddress = GetReceiverAddress(order);
                        worksheet.Cells[startRow, 3].Value = receiverAddress;
                        worksheet.Cells[startRow, 3].Style.VerticalAlignment = ExcelVerticalAlignment.Center;
                        // Sản phẩm
                        var products = GetOrderProducts(order);
                        worksheet.Cells[startRow, 4].Value = products;
                        worksheet.Cells[startRow, 4].Style.VerticalAlignment = ExcelVerticalAlignment.Center;
                        // Thu hộ / Cước phí / Thực nhận
                        var financialInfo = GetOrderFinancialInfo(order);
                        worksheet.Cells[startRow, 5].Value = financialInfo;
                        worksheet.Cells[startRow, 5].Style.VerticalAlignment = ExcelVerticalAlignment.Center;
                        startRow++;
                    }
                }
            }
        }

        /// <summary>
        /// Lấy địa chỉ gửi
        /// </summary>
        private string GetSenderAddress(Order order)
        {
            var senderAddress = order.Addresses?.FirstOrDefault(a => a.AddressType == Lada.Framework.Data.Enums.AddressType.Source);
            if (senderAddress != null)
            {
                var fullAddress = string.IsNullOrEmpty(senderAddress.Address2)
                    ? senderAddress.Address1
                    : $"{senderAddress.Address1}, {senderAddress.Address2}";
                return $"{senderAddress.Name}\n{senderAddress.PhoneNumber1}\n{fullAddress}";
            }
            return "";
        }

        /// <summary>
        /// Lấy địa chỉ nhận
        /// </summary>
        private string GetReceiverAddress(Order order)
        {
            var receiverAddress = order.Addresses?.FirstOrDefault(a => a.AddressType == Lada.Framework.Data.Enums.AddressType.Dest);
            if (receiverAddress != null)
            {
                var fullAddress = string.IsNullOrEmpty(receiverAddress.Address2)
                    ? receiverAddress.Address1
                    : $"{receiverAddress.Address1}, {receiverAddress.Address2}";
                return $"{receiverAddress.Name}\n{receiverAddress.PhoneNumber1}\n{fullAddress}";
            }
            return "";
        }

        /// <summary>
        /// Lấy thông tin sản phẩm
        /// </summary>
        private string GetOrderProducts(Order order)
        {
            if (order.Packages != null && order.Packages.Any())
            {
                var products = order.Packages.Select(p => $"{p.Name} - {p.Quantity} kiện");
                return string.Join("\n", products);
            }
            return "";
        }

        /// <summary>
        /// Lấy thông tin tài chính đơn hàng
        /// </summary>
        private string GetOrderFinancialInfo(Order order)
        {
            var orderFin = order.OrderFin;
            if (orderFin != null)
            {
                var collectAmount = orderFin.CollectAmount;
                var totalFee = orderFin.TotalFeeAfterVat;
                var actualAmount = collectAmount - totalFee;

                return $"{totalFee:N0}";
            }
            return "";
        }

        /// <summary>
        /// Định dạng worksheet chi tiết phiếu chuyển khoản
        /// </summary>
        private void FormatTransferPaymentBillDetailWorksheet(ExcelWorksheet worksheet)
        {
            // Định dạng header (dòng 1)
            worksheet.Row(1).Height = 95;  // độ cao 60
            var headerRange = worksheet.Cells[1, 1, 1, 5];
            headerRange.Style.Border.Left.Style = ExcelBorderStyle.Thin;
            headerRange.Style.Border.Right.Style = ExcelBorderStyle.Thin;
            headerRange.Style.Border.Top.Style = ExcelBorderStyle.Thin;
            headerRange.Style.Border.Bottom.Style = ExcelBorderStyle.Thin;

            // Định dạng thông tin chung (dòng 2-4)
            var generalInfoRange = worksheet.Cells[2, 1, 4, 5];
            generalInfoRange.Style.Border.Top.Style = ExcelBorderStyle.Thin;
            generalInfoRange.Style.Border.Bottom.Style = ExcelBorderStyle.Thin;
            generalInfoRange.Style.Border.Left.Style = ExcelBorderStyle.Thin;
            generalInfoRange.Style.Border.Right.Style = ExcelBorderStyle.Thin;

            // Định dạng header bảng đơn hàng (dòng 6) - nền đỏ
            var ordersHeaderRange = worksheet.Cells[6, 1, 6, 5];
            ordersHeaderRange.Style.Font.Bold = true;
            ordersHeaderRange.Style.Fill.PatternType = ExcelFillStyle.Solid;
            ordersHeaderRange.Style.Fill.BackgroundColor.SetColor(Color.Red);
            ordersHeaderRange.Style.Font.Color.SetColor(Color.White);
            ordersHeaderRange.Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;

            // Enable WrapText cho tất cả cells để xuống dòng hoạt động đúng
            var allCells = worksheet.Cells[worksheet.Dimension.Address];
            allCells.Style.WrapText = true;

            // Thiết lập chiều rộng cột (5 cột A-E)
            worksheet.Column(1).Width = 15; // Mã đơn hàng (A)
            worksheet.Column(2).Width = 35; // Địa chỉ gửi (B)
            worksheet.Column(3).Width = 35; // Địa chỉ nhận (C)
            worksheet.Column(4).Width = 30; // Sản phẩm (D)
            worksheet.Column(5).Width = 25; // Tài chính (E)

            // Thiết lập chiều cao dòng cho header và dữ liệu
            worksheet.Row(5).Height = 40; // Header row
            worksheet.Row(6).Height = 30; // Header row

            var lastRow = worksheet.Dimension?.End.Row ?? 6;
            if (lastRow > 6)
            {
                // Tăng chiều cao cho các dòng dữ liệu đơn hàng
                for (int row = 7; row <= lastRow; row++)
                {
                    worksheet.Row(row).Height = 60; // Chiều cao cho dữ liệu đơn hàng
                }

                var ordersDataRange = worksheet.Cells[6, 1, lastRow, 5];
                ordersDataRange.Style.Border.Top.Style = ExcelBorderStyle.Thin;
                ordersDataRange.Style.Border.Left.Style = ExcelBorderStyle.Thin;
                ordersDataRange.Style.Border.Right.Style = ExcelBorderStyle.Thin;
                ordersDataRange.Style.Border.Bottom.Style = ExcelBorderStyle.Thin;
            }
        }

        /// <summary>
        /// Thiết lập header cho danh sách phiếu chuyển khoản
        /// </summary>
        private void SetupTransferPaymentBillHeaders(ExcelWorksheet worksheet)
        {
            var headers = new[]
            {
                "STT", "Mã phiếu chuyển khoản", "Khách hàng", "Ngày tạo", "Người tạo",
                "Tổng tiền", "Trạng thái", "Ngày duyệt", "Người duyệt",
                "Ngày chuyển khoản", "Người chuyển khoản", "Ghi chú"
            };

            for (int i = 0; i < headers.Length; i++)
            {
                worksheet.Cells[1, i + 1].Value = headers[i];
            }
        }


        /// <summary>
        /// Điền dữ liệu danh sách phiếu chuyển khoản
        /// </summary>
        private void FillTransferPaymentBillData(ExcelWorksheet worksheet, List<TransferPaymentBill> transferPaymentBills)
        {
            int row = 2; // Bắt đầu từ dòng 2 (dòng 1 là header)

            foreach (var transferPaymentBill in transferPaymentBills)
            {
                worksheet.Cells[row, 1].Value = row - 1; // STT
                worksheet.Cells[row, 2].Value = transferPaymentBill.Code; // Mã phiếu chuyển khoản
                worksheet.Cells[row, 3].Value = transferPaymentBill.Customer?.FullName ?? ""; // Khách hàng
                worksheet.Cells[row, 4].Value = transferPaymentBill.CreatedTime?.ToString("dd/MM/yyyy HH:mm") ?? ""; // Ngày tạo
                worksheet.Cells[row, 5].Value = transferPaymentBill.CreatedByUserName ?? ""; // Người tạo
                worksheet.Cells[row, 6].Value = transferPaymentBill.TotalAmount; // Tổng tiền
                worksheet.Cells[row, 7].Value = GetStatusDescription(transferPaymentBill.Status); // Trạng thái
                worksheet.Cells[row, 8].Value = transferPaymentBill.ApprovedDate?.ToString("dd/MM/yyyy HH:mm") ?? ""; // Ngày duyệt
                worksheet.Cells[row, 9].Value = transferPaymentBill.ApprovedByUsername ?? ""; // Người duyệt
                worksheet.Cells[row, 10].Value = transferPaymentBill.Transaction?.CreatedTime?.ToString("dd/MM/yyyy HH:mm") ?? ""; // Ngày chuyển khoản
                worksheet.Cells[row, 11].Value = transferPaymentBill.Transaction?.CreatedByUserName ?? ""; // Người chuyển khoản
                worksheet.Cells[row, 12].Value = transferPaymentBill.Note ?? ""; // Ghi chú

                row++;
            }
        }


        /// <summary>
        /// Định dạng worksheet danh sách phiếu chuyển khoản
        /// </summary>
        private void FormatTransferPaymentBillWorksheet(ExcelWorksheet worksheet, int dataRowCount)
        {
            // Định dạng header
            var headerRange = worksheet.Cells[1, 1, 1, 12];
            headerRange.Style.Font.Bold = true;
            headerRange.Style.Fill.PatternType = ExcelFillStyle.Solid;
            headerRange.Style.Fill.BackgroundColor.SetColor(Color.LightCoral);
            headerRange.Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;

            // Auto-fit columns
            worksheet.Cells.AutoFitColumns();

            // Định dạng border
            var dataRange = worksheet.Cells[1, 1, dataRowCount + 1, 12];
            dataRange.Style.Border.Top.Style = ExcelBorderStyle.Thin;
            dataRange.Style.Border.Left.Style = ExcelBorderStyle.Thin;
            dataRange.Style.Border.Right.Style = ExcelBorderStyle.Thin;
            dataRange.Style.Border.Bottom.Style = ExcelBorderStyle.Thin;
        }



        /// <summary>
        /// Lấy mô tả trạng thái
        /// </summary>
        private string GetStatusDescription(TransferPaymentBillStatus status)
        {
            return status switch
            {
                TransferPaymentBillStatus.Draft => "Nháp",
                TransferPaymentBillStatus.Approved => "Đã duyệt",
                TransferPaymentBillStatus.Cancelled => "Đã hủy",
                _ => status.ToString()
            };
        }

        /// <summary>
        /// Lấy mô tả mức độ ưu tiên
        /// </summary>
        private string GetPriorityDescription(TransferPaymentBillPriority priority)
        {
            return priority switch
            {
                TransferPaymentBillPriority.Low => "Thấp",
                TransferPaymentBillPriority.Medium => "Trung bình",
                TransferPaymentBillPriority.High => "Cao",
                _ => priority.ToString()
            };
        }

        /// <summary>
        /// Xuất Excel danh sách đơn hàng nợ cước của khách hàng
        /// </summary>
        public async Task<TransferPaymentBillExcelExportResult> ExportCustomerTransferableOrdersAsync(CustomerTransferableOrdersExcelExportModel model)
        {
            var result = new TransferPaymentBillExcelExportResult
            {
                ProcessStartTime = DateTimeOffset.Now
            };

            try
            {
                // Validate model
                var validationErrors = model.Validate();
                if (validationErrors.Any())
                {
                    result.Result = Result.Failed;
                    result.Message = string.Join("; ", validationErrors);
                    return result;
                }

                // Lấy dữ liệu đơn hàng nợ cước của khách hàng
                var customerTransferableOrders = await GetCustomerTransferableOrdersDataAsync(model.CustomerId);

                if (customerTransferableOrders == null)
                {
                    result.Result = Result.Failed;
                    result.Message = "Không tìm thấy khách hàng";
                    return result;
                }

                // Tạo file Excel
                var excelPackage = await CreateCustomerTransferableOrdersExcelPackageAsync(customerTransferableOrders, model);

                // Tạo tên file
                var fileName = string.IsNullOrEmpty(model.FileName)
                    ? $"DonHangNoCuoc_{customerTransferableOrders.Customer.FullName}_{DateTime.Now:yyyyMMdd}"
                    : model.FileName;

                // Lưu file sử dụng ExcelFileService
                var saveResult = await _excelFileService.SaveExcelFileAsync(
                    excelPackage,
                    fileName,
                    "customer-transferable-orders",
                    model.FolderPath);

                if (saveResult.Result == Result.Success)
                {
                    // Cập nhật kết quả
                    result.FilePath = saveResult.FilePath;
                    result.FileName = saveResult.SavedFileName;
                    result.DownloadUrl = saveResult.FileUrl;
                    result.FileSize = saveResult.FileSize;
                    result.TotalRecords = customerTransferableOrders.Orders.Count;
                    result.Result = Result.Success;
                    result.Message = "Xuất file Excel thành công";
                }
                else
                {
                    result.Result = saveResult.Result;
                    result.Message = saveResult.Message;
                }
            }
            catch (Exception ex)
            {
                result.Result = Result.SystemError;
                result.Message = $"Lỗi khi xuất file Excel: {ex.Message}";
            }

            result.ProcessEndTime = DateTimeOffset.Now;
            return result;
        }

        /// <summary>
        /// Lấy dữ liệu đơn hàng nợ cước của khách hàng
        /// </summary>
        private async Task<CustomerTransferableOrdersModel?> GetCustomerTransferableOrdersDataAsync(int customerId)
        {
            // Sử dụng TransferPaymentBillService để lấy dữ liệu
            var currentUser = new CurrentUser { UserId = 1, UserName = "System", Roles = new List<string>() }; // Tạm thời dùng system user
            return await _transferPaymentBillService.GetTransferableOrdersByCustomer(customerId, currentUser);
        }

        /// <summary>
        /// Tạo ExcelPackage danh sách đơn hàng nợ cước của khách hàng
        /// </summary>
        private Task<ExcelPackage> CreateCustomerTransferableOrdersExcelPackageAsync(CustomerTransferableOrdersModel customerTransferableOrders, CustomerTransferableOrdersExcelExportModel model)
        {
            var package = new ExcelPackage();
            var worksheet = package.Workbook.Worksheets.Add("Đơn hàng nợ cước");

            // Thêm thông tin công ty
            AddCompanyHeaderForOrders(worksheet);

            // Thông tin khách hàng
            if (model.IncludeCustomerInfo)
            {
                var totalAmount = customerTransferableOrders.Orders.Sum(o => o.TransferFeeAmount);
                AddCustomerInfo(worksheet, customerTransferableOrders.Customer, customerTransferableOrders.Orders.Count, totalAmount);
            }

            // Chi tiết đơn hàng
            AddTransferableOrdersDetail(worksheet, customerTransferableOrders.Orders, model);

            // Định dạng worksheet
            FormatCustomerTransferableOrdersWorksheet(worksheet, customerTransferableOrders.Orders.Count, model);

            return Task.FromResult(package);
        }

        /// <summary>
        /// Thêm thông tin công ty vào đầu worksheet cho đơn hàng nợ cước
        /// </summary>
        private void AddCompanyHeaderForOrders(ExcelWorksheet worksheet)
        {
            // Dòng 1: Thông tin công ty với logo (cột A-B)
            var companyCell = worksheet.Cells[1, 1];
            worksheet.Cells[1, 1, 1, 2].Merge = true;
            companyCell.Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
            companyCell.Style.VerticalAlignment = ExcelVerticalAlignment.Center;

            // Thêm logo vào cùng cell với thông tin công ty
            var logoPath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "images", "logo.svg");
            if (File.Exists(logoPath))
            {
                var logo = worksheet.Drawings.AddPicture("Logo", new FileInfo(logoPath));
                logo.SetPosition(0, 5, 0, 100); // Dòng 0, offset 5px từ trên và trái
                logo.SetSize(110, 40); // Kích thước logo 40x40 pixels
            }

            // Tạo rich text với font khác nhau cho thông tin công ty
            var richText = companyCell.RichText.Add("\n\nCÔNG TY TNHH LADA EXPRESS");
            richText.Bold = true;
            richText.Size = 14;

            richText = companyCell.RichText.Add("\nWebsite: https://ladaexpress.vn");
            richText.Bold = false;
            richText.Size = 10;

            richText = companyCell.RichText.Add("\nHotline: 1900.633.658");
            richText.Bold = false;
            richText.Size = 10;

            // Dòng 1: Tiêu đề PHIẾU TỔNG HỢP CÔNG NỢ (cột D-E)
            var titleCell = worksheet.Cells[1, 3];
            worksheet.Cells[1, 3, 1, 5].Merge = true;
            titleCell.Value = "PHIẾU TỔNG HỢP CÔNG NỢ";
            titleCell.Style.Font.Bold = true;
            titleCell.Style.Font.Size = 16;
            titleCell.Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
            titleCell.Style.VerticalAlignment = ExcelVerticalAlignment.Center;
        }

        /// <summary>
        /// Thêm thông tin khách hàng
        /// </summary>
        private void AddCustomerInfo(ExcelWorksheet worksheet, CustomerInfoModel customer, int orderCount, decimal totalAmount)
        {
            // Dòng 2: Khách hàng (cột A-B) và Tổng cước phí (cột D-E)
            worksheet.Cells[2, 1].Style.VerticalAlignment = ExcelVerticalAlignment.Center;
            worksheet.Cells[2, 1].Value = "Khách hàng:";
            worksheet.Cells[2, 2].Value = customer.FullName;

            worksheet.Cells[2, 4].Style.VerticalAlignment = ExcelVerticalAlignment.Center;
            worksheet.Cells[2, 4].Value = "Tổng cước phí:";
            worksheet.Cells[2, 5].Value = totalAmount;
            worksheet.Cells[2, 5].Style.Numberformat.Format = "#,##0 ₫";

            // Dòng 3: Số lượng đơn hàng (cột D-E)
            worksheet.Cells[3, 4].Style.VerticalAlignment = ExcelVerticalAlignment.Center;
            worksheet.Cells[3, 4].Value = "Số lượng đơn hàng:";
            worksheet.Cells[3, 5].Value = orderCount;
        }

        /// <summary>
        /// Thêm chi tiết đơn hàng nợ cước
        /// </summary>
        private void AddTransferableOrdersDetail(ExcelWorksheet worksheet, List<TransferPaymentBillOrderItem> orders, CustomerTransferableOrdersExcelExportModel model)
        {
            // Dòng 5: Tiêu đề "DANH SÁCH ĐƠN HÀNG"
            worksheet.Cells[5, 1].Value = "DANH SÁCH ĐƠN HÀNG";
            worksheet.Cells[5, 1, 5, 5].Merge = true;
            worksheet.Cells[5, 1].Style.VerticalAlignment = ExcelVerticalAlignment.Center;
            worksheet.Cells[5, 1].Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
            worksheet.Cells[5, 1].Style.Font.Bold = true;
            worksheet.Cells[5, 1].Style.Font.Size = 14;
            worksheet.Cells[5, 1].Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;

            // Dòng 6: Header cho bảng đơn hàng (nền đỏ)
            worksheet.Cells[6, 1].Value = "Mã đơn hàng & Ngày tạo";
            worksheet.Cells[6, 1].Style.VerticalAlignment = ExcelVerticalAlignment.Center;
            worksheet.Cells[6, 1].Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
            worksheet.Cells[6, 2].Value = "Người gửi";
            worksheet.Cells[6, 2].Style.VerticalAlignment = ExcelVerticalAlignment.Center;
            worksheet.Cells[6, 2].Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
            worksheet.Cells[6, 3].Value = "Người nhận";
            worksheet.Cells[6, 3].Style.VerticalAlignment = ExcelVerticalAlignment.Center;
            worksheet.Cells[6, 3].Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
            worksheet.Cells[6, 4].Value = "Sản phẩm";
            worksheet.Cells[6, 4].Style.VerticalAlignment = ExcelVerticalAlignment.Center;
            worksheet.Cells[6, 4].Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
            worksheet.Cells[6, 5].Value = "Cước phí";
            worksheet.Cells[6, 5].Style.VerticalAlignment = ExcelVerticalAlignment.Center;
            worksheet.Cells[6, 5].Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;

            int startRow = 7; // Bắt đầu dữ liệu từ dòng 7

            // Dữ liệu đơn hàng
            if (orders != null && orders.Any())
            {
                foreach (var order in orders)
                {
                    // Mã đơn hàng và ngày tạo với định dạng khác nhau
                    var orderCell = worksheet.Cells[startRow, 1];
                    orderCell.Style.VerticalAlignment = ExcelVerticalAlignment.Center;

                    // Tạo rich text với font khác nhau
                    var richText = orderCell.RichText.Add(order.OrderCode ?? "");
                    richText.Bold = true;
                    richText.Size = 11;

                    richText = orderCell.RichText.Add($"\n{order.OrderCreatedTime:dd/MM/yyyy HH:mm}");
                    richText.Bold = false;
                    richText.Size = 9;
                    richText.Italic = true;

                    // Người gửi (gộp tên, số điện thoại và địa chỉ)
                    var senderInfo = $"{order.SenderName}\n{order.SenderPhone}\n{order.SenderAddress}";
                    worksheet.Cells[startRow, 2].Value = senderInfo;
                    worksheet.Cells[startRow, 2].Style.VerticalAlignment = ExcelVerticalAlignment.Center;

                    // Người nhận (gộp tên, số điện thoại và địa chỉ)
                    var receiverInfo = $"{order.ReceiverName}\n{order.ReceiverPhone}\n{order.ReceiverAddress}";
                    worksheet.Cells[startRow, 3].Value = receiverInfo;
                    worksheet.Cells[startRow, 3].Style.VerticalAlignment = ExcelVerticalAlignment.Center;

                    // Sản phẩm
                    worksheet.Cells[startRow, 4].Value = order.ProductInfo ?? "";
                    worksheet.Cells[startRow, 4].Style.VerticalAlignment = ExcelVerticalAlignment.Center;

                    // Tài chính (cước phí chuyển khoản)
                    worksheet.Cells[startRow, 5].Value = order.TransferFeeAmount;
                    worksheet.Cells[startRow, 5].Style.Numberformat.Format = "#,##0 ₫";
                    worksheet.Cells[startRow, 5].Style.VerticalAlignment = ExcelVerticalAlignment.Center;

                    startRow++;
                }
            }
        }

        /// <summary>
        /// Định dạng worksheet danh sách đơn hàng nợ cước
        /// </summary>
        private void FormatCustomerTransferableOrdersWorksheet(ExcelWorksheet worksheet, int orderCount, CustomerTransferableOrdersExcelExportModel model)
        {
            // Định dạng header (dòng 1)
            worksheet.Row(1).Height = 95;  // độ cao 60
            var headerRange = worksheet.Cells[1, 1, 1, 5];
            headerRange.Style.Border.Left.Style = ExcelBorderStyle.Thin;
            headerRange.Style.Border.Right.Style = ExcelBorderStyle.Thin;
            headerRange.Style.Border.Top.Style = ExcelBorderStyle.Thin;
            headerRange.Style.Border.Bottom.Style = ExcelBorderStyle.Thin;

            // Định dạng thông tin chung (dòng 2-4)
            var generalInfoRange = worksheet.Cells[2, 1, 4, 5];
            generalInfoRange.Style.Border.Top.Style = ExcelBorderStyle.Thin;
            generalInfoRange.Style.Border.Bottom.Style = ExcelBorderStyle.Thin;
            generalInfoRange.Style.Border.Left.Style = ExcelBorderStyle.Thin;
            generalInfoRange.Style.Border.Right.Style = ExcelBorderStyle.Thin;

            // Định dạng header bảng đơn hàng (dòng 6) - nền đỏ
            var ordersHeaderRange = worksheet.Cells[6, 1, 6, 5];
            ordersHeaderRange.Style.Font.Bold = true;
            ordersHeaderRange.Style.Fill.PatternType = ExcelFillStyle.Solid;
            ordersHeaderRange.Style.Fill.BackgroundColor.SetColor(Color.Red);
            ordersHeaderRange.Style.Font.Color.SetColor(Color.White);
            ordersHeaderRange.Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;

            // Enable WrapText cho tất cả cells để xuống dòng hoạt động đúng
            var allCells = worksheet.Cells[worksheet.Dimension.Address];
            allCells.Style.WrapText = true;

            // Thiết lập chiều rộng cột (5 cột A-E)
            worksheet.Column(1).Width = 15; // Mã đơn hàng (A)
            worksheet.Column(2).Width = 35; // Người gửi (B)
            worksheet.Column(3).Width = 35; // Người nhận (C)
            worksheet.Column(4).Width = 30; // Sản phẩm (D)
            worksheet.Column(5).Width = 25; // Tài chính (E)

            // Thiết lập chiều cao dòng cho header và dữ liệu
            worksheet.Row(5).Height = 40; // Header row
            worksheet.Row(6).Height = 30; // Header row

            var lastRow = worksheet.Dimension?.End.Row ?? 6;
            if (lastRow > 6)
            {
                // Tăng chiều cao cho các dòng dữ liệu đơn hàng
                for (int row = 7; row <= lastRow; row++)
                {
                    worksheet.Row(row).Height = 60; // Chiều cao cho dữ liệu đơn hàng
                }

                var ordersDataRange = worksheet.Cells[6, 1, lastRow, 5];
                ordersDataRange.Style.Border.Top.Style = ExcelBorderStyle.Thin;
                ordersDataRange.Style.Border.Left.Style = ExcelBorderStyle.Thin;
                ordersDataRange.Style.Border.Right.Style = ExcelBorderStyle.Thin;
                ordersDataRange.Style.Border.Bottom.Style = ExcelBorderStyle.Thin;
            }
        }

        #endregion
    }
}