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

namespace Ladaer.BackEnd.Infrastructures.Services.Finance
{
    /// <summary>
    /// Interface cho dịch vụ xuất Excel phiếu đối soát khách hàng
    /// </summary>
    public interface ICustomerReconciliationSlipExcelService
    {
        /// <summary>
        /// Xuất Excel danh sách phiếu đối soát khách hàng
        /// </summary>
        /// <param name="model">Model xuất Excel</param>
        /// <returns>Kết quả xuất file</returns>
        Task<CustomerReconciliationSlipExcelExportResult> ExportCustomerReconciliationSlipsAsync(CustomerReconciliationSlipExcelExportModel model);

        /// <summary>
        /// Xuất Excel chi tiết phiếu đối soát khách hàng
        /// </summary>
        /// <param name="slipId">ID phiếu đối soát</param>
        /// <param name="model">Model xuất Excel</param>
        /// <returns>Kết quả xuất file</returns>
        Task<CustomerReconciliationSlipExcelExportResult> ExportCustomerReconciliationSlipDetailAsync(int slipId, CustomerReconciliationSlipExcelExportModel model);

        /// <summary>
        /// Xuất Excel danh sách đơn hàng cần đối soát của khách hàng
        /// </summary>
        /// <param name="customerId">ID khách hàng</param>
        /// <param name="userId">ID người dùng hiện tại</param>
        /// <param name="model">Model xuất Excel</param>
        /// <returns>Kết quả xuất file</returns>
        Task<CustomerReconciliationSlipExcelExportResult> ExportReconciliableOrdersAsync(int customerId, int userId, CustomerReconciliationSlipExcelExportModel model);
    }

    /// <summary>
    /// Dịch vụ xuất Excel phiếu đối soát khách hàng
    /// </summary>
    public class CustomerReconciliationSlipExcelService : ICustomerReconciliationSlipExcelService
    {
        private readonly IRepository<CustomerReconciliationSlip> _slipRepository;
        private readonly IRepository<CustomerReconciliationSlipDetail> _detailRepository;
        private readonly IRepository<Customer> _customerRepository;
        private readonly IRepository<Order> _orderRepository;
        private readonly IExcelFileService _excelFileService;
        private readonly ICustomerReconciliationSlipService _customerReconciliationSlipService;

        public CustomerReconciliationSlipExcelService(
            IRepository<CustomerReconciliationSlip> slipRepository,
            IRepository<CustomerReconciliationSlipDetail> detailRepository,
            IRepository<Customer> customerRepository,
            IRepository<Order> orderRepository,
            IExcelFileService excelFileService,
            ICustomerReconciliationSlipService customerReconciliationSlipService)
        {
            _slipRepository = slipRepository;
            _detailRepository = detailRepository;
            _customerRepository = customerRepository;
            _orderRepository = orderRepository;
            _excelFileService = excelFileService;
            _customerReconciliationSlipService = customerReconciliationSlipService;
        }

        /// <summary>
        /// Xuất Excel danh sách phiếu đối soát khách hàng
        /// </summary>
        public async Task<CustomerReconciliationSlipExcelExportResult> ExportCustomerReconciliationSlipsAsync(CustomerReconciliationSlipExcelExportModel model)
        {
            var result = new CustomerReconciliationSlipExcelExportResult
            {
                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 đối soát
                var slips = await GetSlipsDataAsync(model);

                // Tạo file Excel
                var excelPackage = await CreateSlipsExcelPackageAsync(slips, model);

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

                // Lưu file sử dụng ExcelFileService
                var saveResult = await _excelFileService.SaveExcelFileAsync(
                    excelPackage,
                    fileName,
                    "customer-reconciliation-slips",
                    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 = slips.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 đối soát khách hàng
        /// </summary>
        public async Task<CustomerReconciliationSlipExcelExportResult> ExportCustomerReconciliationSlipDetailAsync(int slipId, CustomerReconciliationSlipExcelExportModel model)
        {
            var result = new CustomerReconciliationSlipExcelExportResult
            {
                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 đối soát
                var slipDetail = await GetSlipDetailDataAsync(slipId);

                if (slipDetail == null)
                {
                    result.Result = Result.Failed;
                    result.Message = "Không tìm thấy phiếu đối soát";
                    return result;
                }

                // Tạo file Excel
                var excelPackage = await CreateSlipDetailExcelPackageAsync(slipDetail, model);

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

                // Lưu file sử dụng ExcelFileService
                var saveResult = await _excelFileService.SaveExcelFileAsync(
                    excelPackage,
                    fileName,
                    "customer-reconciliation-slips",
                    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;
        }

        /// <summary>
        /// Xuất Excel danh sách đơn hàng cần đối soát của khách hàng
        /// </summary>
        public async Task<CustomerReconciliationSlipExcelExportResult> ExportReconciliableOrdersAsync(int customerId, int userId, CustomerReconciliationSlipExcelExportModel model)
        {
            var result = new CustomerReconciliationSlipExcelExportResult
            {
                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 danh sách đơn hàng cần đối soát
                var orders = await _customerReconciliationSlipService.GetReconciliableOrdersAsync(customerId, userId);

                if (orders == null || !orders.Any())
                {
                    result.Result = Result.Failed;
                    result.Message = "Không có đơn hàng nào cần đối soát";
                    return result;
                }

                // Lấy thông tin khách hàng
                var customer = await _customerRepository.GetByIdAsync(customerId);
                if (customer == 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 CreateReconciliableOrdersExcelPackageAsync(customer, orders, model);

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

                // Lưu file sử dụng ExcelFileService
                var saveResult = await _excelFileService.SaveExcelFileAsync(
                    excelPackage,
                    fileName,
                    "reconciliable-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 = 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;
        }

        #region Private Methods

        /// <summary>
        /// Lấy dữ liệu phiếu đối soát
        /// </summary>
        private async Task<List<CustomerReconciliationSlip>> GetSlipsDataAsync(CustomerReconciliationSlipExcelExportModel model)
        {
            var query = _slipRepository.Query()
                .Include(s => s.Customer)
                .Include(s => s.Details)
                    .ThenInclude(d => d.Order)
                .AsQueryable();

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

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

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

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

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

            // Filter theo loại
            if (model.Type.HasValue)
            {
                query = query.Where(s => (int)s.Type == model.Type.Value);
            }

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

        /// <summary>
        /// Lấy dữ liệu chi tiết phiếu đối soát
        /// </summary>
        private async Task<CustomerReconciliationSlip?> GetSlipDetailDataAsync(int slipId)
        {
            return await _slipRepository.Query()
                .Include(s => s.Customer)
                .Include(s => s.Details)
                    .ThenInclude(d => d.Order)
                    .ThenInclude(o => o.Addresses)
                .Include(s => s.Details)
                    .ThenInclude(d => d.Order)
                    .ThenInclude(o => o.Packages)
                .Include(s => s.Details)
                    .ThenInclude(d => d.Order)
                    .ThenInclude(o => o.OrderFin)
                .Include(s => s.Logs)
                .FirstOrDefaultAsync(s => s.Id == slipId);
        }

        /// <summary>
        /// Tạo ExcelPackage danh sách phiếu đối soát
        /// </summary>
        private Task<ExcelPackage> CreateSlipsExcelPackageAsync(List<CustomerReconciliationSlip> slips, CustomerReconciliationSlipExcelExportModel model)
        {
            var package = new ExcelPackage();
            var worksheet = package.Workbook.Worksheets.Add("Danh sách phiếu đối soát");

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

            // Điền dữ liệu
            FillSlipsData(worksheet, slips);

            // Định dạng worksheet
            FormatSlipsWorksheet(worksheet, slips.Count);

            return Task.FromResult(package);
        }

        /// <summary>
        /// Tạo ExcelPackage chi tiết phiếu đối soát
        /// </summary>
        private Task<ExcelPackage> CreateSlipDetailExcelPackageAsync(CustomerReconciliationSlip slip, CustomerReconciliationSlipExcelExportModel model)
        {
            var package = new ExcelPackage();
            var worksheet = package.Workbook.Worksheets.Add("Phiếu đối soát chi tiết");

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

            // Thông tin chung phiếu đối soát
            AddSlipGeneralInfo(worksheet, slip);

            // Chi tiết đơn hàng
            if (model.IncludeOrderDetails)
            {
                AddSlipOrdersDetail(worksheet, slip);
            }

            // Định dạng worksheet
            FormatSlipDetailWorksheet(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 110x40 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 ĐỐI SOÁT (cột D-E)
            var titleCell = worksheet.Cells[1, 3];
            worksheet.Cells[1, 3, 1, 5].Merge = true;
            titleCell.Value = "PHIẾU ĐỐI SOÁT";
            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 đối soát
        /// </summary>
        private void AddSlipGeneralInfo(ExcelWorksheet worksheet, CustomerReconciliationSlip slip)
        {
            int currentRow = 4;

            // Cột trái: Mã phiếu đối soát và Khách hàng
            worksheet.Cells[currentRow, 1].Value = "Mã phiếu:";
            worksheet.Cells[currentRow, 1].Style.Font.Bold = true;
            worksheet.Cells[currentRow, 2, currentRow, 2].Merge = true;
            worksheet.Cells[currentRow, 2].Value = slip.Code;

            currentRow++;
            worksheet.Cells[currentRow, 1].Value = "Khách hàng:";
            worksheet.Cells[currentRow, 1].Style.Font.Bold = true;
            worksheet.Cells[currentRow, 2, currentRow, 2].Merge = true;
            worksheet.Cells[currentRow, 2].Value = slip.Customer?.FullName ?? "";

            // Cột phải: Thông tin tài chính
            currentRow = 4;
            worksheet.Cells[currentRow, 4].Value = "Tổng tiền thu hộ:";
            worksheet.Cells[currentRow, 4].Style.Font.Bold = true;
            worksheet.Cells[currentRow, 5].Value = slip.TotalCodAmount;
            worksheet.Cells[currentRow, 5].Style.Numberformat.Format = "#,##0 ₫";
            worksheet.Cells[currentRow, 5].Style.HorizontalAlignment = ExcelHorizontalAlignment.Right;

            currentRow++;
            worksheet.Cells[currentRow, 4].Value = "Tổng cước phí:";
            worksheet.Cells[currentRow, 4].Style.Font.Bold = true;
            worksheet.Cells[currentRow, 5].Value = slip.TotalFeeAmount;
            worksheet.Cells[currentRow, 5].Style.Numberformat.Format = "#,##0 ₫";
            worksheet.Cells[currentRow, 5].Style.HorizontalAlignment = ExcelHorizontalAlignment.Right;

            currentRow++;
            // Label thay đổi tùy theo loại phiếu
            var finalAmountLabel = slip.Type == CustomerReconciliationSlipType.Receivable
                ? "Số tiền thực nhận:"
                : "Số tiền cần thanh toán:";
            worksheet.Cells[currentRow, 4].Value = finalAmountLabel;
            worksheet.Cells[currentRow, 4].Style.Font.Bold = true;
            worksheet.Cells[currentRow, 5].Value = slip.FinalAmount;
            worksheet.Cells[currentRow, 5].Style.Numberformat.Format = "#,##0 ₫";
            worksheet.Cells[currentRow, 5].Style.Font.Bold = true;
            worksheet.Cells[currentRow, 5].Style.HorizontalAlignment = ExcelHorizontalAlignment.Right;
        }

        /// <summary>
        /// Thêm chi tiết đơn hàng
        /// </summary>
        private void AddSlipOrdersDetail(ExcelWorksheet worksheet, CustomerReconciliationSlip slip)
        {
            int headerRow = 7;

            // Tiêu đề bảng
            worksheet.Cells[headerRow, 1].Value = "DANH SÁCH ĐƠN HÀNG";
            worksheet.Cells[headerRow, 1, headerRow, 5].Merge = true;
            worksheet.Cells[headerRow, 1].Style.Font.Bold = true;
            worksheet.Cells[headerRow, 1].Style.Font.Size = 14;
            worksheet.Cells[headerRow, 1].Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;

            // Header bảng với màu đỏ
            int tableHeaderRow = headerRow + 1;
            worksheet.Cells[tableHeaderRow, 1].Value = "Mã đơn hàng";
            worksheet.Cells[tableHeaderRow, 2].Value = "Địa chỉ gửi";
            worksheet.Cells[tableHeaderRow, 3].Value = "Địa chỉ nhận";
            worksheet.Cells[tableHeaderRow, 4].Value = "Sản phẩm";
            worksheet.Cells[tableHeaderRow, 5].Value = "Tái chính";

            var headerRange = worksheet.Cells[tableHeaderRow, 1, tableHeaderRow, 5];
            headerRange.Style.Font.Bold = true;
            headerRange.Style.Font.Color.SetColor(Color.White);
            headerRange.Style.Fill.PatternType = ExcelFillStyle.Solid;
            headerRange.Style.Fill.BackgroundColor.SetColor(Color.Red);
            headerRange.Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
            headerRange.Style.VerticalAlignment = ExcelVerticalAlignment.Center;
            headerRange.Style.Border.Top.Style = ExcelBorderStyle.Thin;
            headerRange.Style.Border.Left.Style = ExcelBorderStyle.Thin;
            headerRange.Style.Border.Right.Style = ExcelBorderStyle.Thin;
            headerRange.Style.Border.Bottom.Style = ExcelBorderStyle.Thin;

            int dataRow = tableHeaderRow + 1;
            if (slip.Details != null && slip.Details.Any())
            {
                foreach (var detail in slip.Details)
                {
                    var order = detail.Order;

                    // Mã đơn hàng
                    worksheet.Cells[dataRow, 1].Value = order?.Code ?? "";
                    worksheet.Cells[dataRow, 1].Style.VerticalAlignment = ExcelVerticalAlignment.Center;

                    // Địa chỉ gửi
                    var senderAddress = order?.Addresses?.FirstOrDefault(a => a.AddressType == Lada.Framework.Data.Enums.AddressType.Source);
                    if (senderAddress != null)
                    {
                        var senderInfo = $"{senderAddress.Name}\n{senderAddress.PhoneNumber1}\n{senderAddress.Address1}";
                        worksheet.Cells[dataRow, 2].Value = senderInfo;
                    }
                    worksheet.Cells[dataRow, 2].Style.WrapText = true;
                    worksheet.Cells[dataRow, 2].Style.VerticalAlignment = ExcelVerticalAlignment.Center;

                    // Địa chỉ nhận
                    var receiverAddress = order?.Addresses?.FirstOrDefault(a => a.AddressType == Lada.Framework.Data.Enums.AddressType.Dest);
                    if (receiverAddress != null)
                    {
                        var receiverInfo = $"{receiverAddress.Name}\n{receiverAddress.PhoneNumber1}\n{receiverAddress.Address1}";
                        worksheet.Cells[dataRow, 3].Value = receiverInfo;
                    }
                    worksheet.Cells[dataRow, 3].Style.WrapText = true;
                    worksheet.Cells[dataRow, 3].Style.VerticalAlignment = ExcelVerticalAlignment.Center;

                    // Sản phẩm
                    if (order?.Packages != null && order.Packages.Any())
                    {
                        var packageInfo = string.Join("\n", order.Packages.Select(p =>
                            $"{p.Quantity} kiện {p.Name} - {p.Weight}g"));
                        worksheet.Cells[dataRow, 4].Value = packageInfo;
                    }
                    worksheet.Cells[dataRow, 4].Style.WrapText = true;
                    worksheet.Cells[dataRow, 4].Style.VerticalAlignment = ExcelVerticalAlignment.Center;

                    // Tái chính (Thu hộ, Cước phí, Thực nhận)
                    var financialInfo = $"Thu hộ: {detail.AppliedCodAmount:#,##0}\n" +
                                      $"Cước phí: {detail.AppliedFeeAmount:#,##0}\n" +
                                      $"Thực nhận: {detail.NetAmount:#,##0}";
                    worksheet.Cells[dataRow, 5].Value = financialInfo;
                    worksheet.Cells[dataRow, 5].Style.WrapText = true;
                    worksheet.Cells[dataRow, 5].Style.VerticalAlignment = ExcelVerticalAlignment.Center;

                    // Border cho từng ô
                    for (int col = 1; col <= 5; col++)
                    {
                        worksheet.Cells[dataRow, col].Style.Border.Top.Style = ExcelBorderStyle.Thin;
                        worksheet.Cells[dataRow, col].Style.Border.Left.Style = ExcelBorderStyle.Thin;
                        worksheet.Cells[dataRow, col].Style.Border.Right.Style = ExcelBorderStyle.Thin;
                        worksheet.Cells[dataRow, col].Style.Border.Bottom.Style = ExcelBorderStyle.Thin;
                    }

                    dataRow++;
                }
            }
        }

        /// <summary>
        /// Định dạng worksheet chi tiết phiếu đối soát
        /// </summary>
        private void FormatSlipDetailWorksheet(ExcelWorksheet worksheet)
        {
            // Định dạng header (dòng 1)
            worksheet.Row(1).Height = 95;  // độ cao 95
            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-6)
            var generalInfoRange = worksheet.Cells[2, 1, 6, 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 8) - nền đỏ
            var ordersHeaderRange = worksheet.Cells[8, 1, 8, 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(7).Height = 40; // Tiêu đề "DANH SÁCH ĐƠN HÀNG"
            worksheet.Row(8).Height = 30; // Header row

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

                var ordersDataRange = worksheet.Cells[8, 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 đối soát
        /// </summary>
        private void SetupSlipsHeaders(ExcelWorksheet worksheet)
        {
            var headers = new[]
            {
                "STT", "Mã phiếu", "Khách hàng", "Loại phiếu", "Trạng thái",
                "Tổng COD", "Tổng phí", "Số tiền cuối", "Số đơn hàng",
                "Ngày tạo", "Người tạo", "Ngày hoàn thành", "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 đối soát
        /// </summary>
        private void FillSlipsData(ExcelWorksheet worksheet, List<CustomerReconciliationSlip> slips)
        {
            int row = 2;

            foreach (var slip in slips)
            {
                worksheet.Cells[row, 1].Value = row - 1; // STT
                worksheet.Cells[row, 2].Value = slip.Code;
                worksheet.Cells[row, 3].Value = slip.Customer?.FullName ?? "";
                worksheet.Cells[row, 4].Value = slip.Type == CustomerReconciliationSlipType.Receivable ? "Chi tiền" : "Thu tiền";
                worksheet.Cells[row, 5].Value = GetStatusDescription(slip.Status);
                worksheet.Cells[row, 6].Value = slip.TotalCodAmount;
                worksheet.Cells[row, 7].Value = slip.TotalFeeAmount;
                worksheet.Cells[row, 8].Value = slip.FinalAmount;
                worksheet.Cells[row, 9].Value = slip.Details?.Count ?? 0;
                worksheet.Cells[row, 10].Value = slip.CreatedTime?.ToString("dd/MM/yyyy HH:mm") ?? "";
                worksheet.Cells[row, 11].Value = slip.CreatedByUserName ?? "";
                worksheet.Cells[row, 12].Value = slip.CompletedTime?.ToString("dd/MM/yyyy HH:mm") ?? "";
                worksheet.Cells[row, 13].Value = slip.InternalNote ?? "";

                row++;
            }
        }

        /// <summary>
        /// Định dạng worksheet danh sách phiếu đối soát
        /// </summary>
        private void FormatSlipsWorksheet(ExcelWorksheet worksheet, int dataRowCount)
        {
            var headerRange = worksheet.Cells[1, 1, 1, 13];
            headerRange.Style.Font.Bold = true;
            headerRange.Style.Fill.PatternType = ExcelFillStyle.Solid;
            headerRange.Style.Fill.BackgroundColor.SetColor(Color.LightBlue);
            headerRange.Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;

            worksheet.Cells.AutoFitColumns();

            var dataRange = worksheet.Cells[1, 1, dataRowCount + 1, 13];
            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(CustomerReconciliationSlipStatus status)
        {
            return status switch
            {
                CustomerReconciliationSlipStatus.Draft => "Nháp",
                CustomerReconciliationSlipStatus.PendingApproval => "Chờ duyệt",
                CustomerReconciliationSlipStatus.Approved => "Đã duyệt",
                CustomerReconciliationSlipStatus.Completed => "Hoàn thành",
                CustomerReconciliationSlipStatus.Rejected => "Từ chối",
                _ => status.ToString()
            };
        }

        /// <summary>
        /// Tạo ExcelPackage danh sách đơn hàng cần đối soát
        /// </summary>
        private Task<ExcelPackage> CreateReconciliableOrdersExcelPackageAsync(Customer customer, List<CustomerReconciliationSlipDetailItem> orders, CustomerReconciliationSlipExcelExportModel model)
        {
            var package = new ExcelPackage();
            var worksheet = package.Workbook.Worksheets.Add("Danh sách đơn hàng cần đối soát");

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

            // Thay đổi tiêu đề
            var titleCell = worksheet.Cells[1, 3];
            titleCell.Value = "DANH SÁCH ĐƠN HÀNG CẦN ĐỐI SOÁT";

            // Thông tin khách hàng
            AddReconciliableOrdersInfo(worksheet, customer, orders);

            // Chi tiết đơn hàng
            if (model.IncludeOrderDetails)
            {
                AddReconciliableOrdersTable(worksheet, orders);
            }

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

            return Task.FromResult(package);
        }

        /// <summary>
        /// Thêm thông tin khách hàng và tổng hợp tài chính
        /// </summary>
        private void AddReconciliableOrdersInfo(ExcelWorksheet worksheet, Customer customer, List<CustomerReconciliationSlipDetailItem> orders)
        {
            int currentRow = 4;

            // Cột trái: Mã khách hàng và Tên khách hàng
            worksheet.Cells[currentRow, 1].Value = "Mã khách hàng:";
            worksheet.Cells[currentRow, 1].Style.Font.Bold = true;
            worksheet.Cells[currentRow, 2, currentRow, 3].Merge = true;
            worksheet.Cells[currentRow, 2].Value = customer.UserName ?? "";

            currentRow++;
            worksheet.Cells[currentRow, 1].Value = "Tên khách hàng:";
            worksheet.Cells[currentRow, 1].Style.Font.Bold = true;
            worksheet.Cells[currentRow, 2, currentRow, 3].Merge = true;
            worksheet.Cells[currentRow, 2].Value = customer.FullName ?? "";

            // Cột phải: Thông tin tài chính
            currentRow = 4;
            var totalCodAmount = orders?.Sum(x => x.AppliedCodAmount) ?? 0;
            var totalFeeAmount = orders?.Sum(x => x.AppliedFeeAmount) ?? 0;
            var finalAmount = totalCodAmount - totalFeeAmount;

            worksheet.Cells[currentRow, 4].Value = "Tổng tiền thu hộ:";
            worksheet.Cells[currentRow, 4].Style.Font.Bold = true;
            worksheet.Cells[currentRow, 5].Value = totalCodAmount;
            worksheet.Cells[currentRow, 5].Style.Numberformat.Format = "#,##0 ₫";
            worksheet.Cells[currentRow, 5].Style.HorizontalAlignment = ExcelHorizontalAlignment.Right;

            currentRow++;
            worksheet.Cells[currentRow, 4].Value = "Tổng cước phí:";
            worksheet.Cells[currentRow, 4].Style.Font.Bold = true;
            worksheet.Cells[currentRow, 5].Value = totalFeeAmount;
            worksheet.Cells[currentRow, 5].Style.Numberformat.Format = "#,##0 ₫";
            worksheet.Cells[currentRow, 5].Style.HorizontalAlignment = ExcelHorizontalAlignment.Right;

            currentRow++;
            worksheet.Cells[currentRow, 4].Value = "Số tiền cần thanh toán:";
            worksheet.Cells[currentRow, 4].Style.Font.Bold = true;
            worksheet.Cells[currentRow, 5].Value = finalAmount;
            worksheet.Cells[currentRow, 5].Style.Numberformat.Format = "#,##0 ₫";
            worksheet.Cells[currentRow, 5].Style.Font.Bold = true;
            worksheet.Cells[currentRow, 5].Style.HorizontalAlignment = ExcelHorizontalAlignment.Right;
        }

        /// <summary>
        /// Thêm bảng đơn hàng cần đối soát
        /// </summary>
        private void AddReconciliableOrdersTable(ExcelWorksheet worksheet, List<CustomerReconciliationSlipDetailItem> orders)
        {
            int headerRow = 7;

            // Tiêu đề bảng
            worksheet.Cells[headerRow, 1].Value = "DANH SÁCH ĐƠN HÀNG";
            worksheet.Cells[headerRow, 1, headerRow, 5].Merge = true;
            worksheet.Cells[headerRow, 1].Style.Font.Bold = true;
            worksheet.Cells[headerRow, 1].Style.Font.Size = 14;
            worksheet.Cells[headerRow, 1].Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;

            // Header bảng với màu đỏ
            int tableHeaderRow = headerRow + 1;
            worksheet.Cells[tableHeaderRow, 1].Value = "Mã đơn hàng";
            worksheet.Cells[tableHeaderRow, 2].Value = "Địa chỉ gửi";
            worksheet.Cells[tableHeaderRow, 3].Value = "Địa chỉ nhận";
            worksheet.Cells[tableHeaderRow, 4].Value = "Sản phẩm";
            worksheet.Cells[tableHeaderRow, 5].Value = "Tài chính";

            var headerRange = worksheet.Cells[tableHeaderRow, 1, tableHeaderRow, 5];
            headerRange.Style.Font.Bold = true;
            headerRange.Style.Font.Color.SetColor(Color.White);
            headerRange.Style.Fill.PatternType = ExcelFillStyle.Solid;
            headerRange.Style.Fill.BackgroundColor.SetColor(Color.Red);
            headerRange.Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
            headerRange.Style.VerticalAlignment = ExcelVerticalAlignment.Center;
            headerRange.Style.Border.Top.Style = ExcelBorderStyle.Thin;
            headerRange.Style.Border.Left.Style = ExcelBorderStyle.Thin;
            headerRange.Style.Border.Right.Style = ExcelBorderStyle.Thin;
            headerRange.Style.Border.Bottom.Style = ExcelBorderStyle.Thin;

            int dataRow = tableHeaderRow + 1;
            if (orders != null && orders.Any())
            {
                foreach (var order in orders)
                {
                    // Mã đơn hàng
                    worksheet.Cells[dataRow, 1].Value = order.OrderCode ?? "";
                    worksheet.Cells[dataRow, 1].Style.VerticalAlignment = ExcelVerticalAlignment.Center;

                    // Địa chỉ gửi
                    if (!string.IsNullOrEmpty(order.SenderName) || !string.IsNullOrEmpty(order.SenderPhone) || !string.IsNullOrEmpty(order.SenderAddress))
                    {
                        var senderInfo = $"{order.SenderName}\n{order.SenderPhone}\n{order.SenderAddress}";
                        worksheet.Cells[dataRow, 2].Value = senderInfo;
                    }
                    worksheet.Cells[dataRow, 2].Style.WrapText = true;
                    worksheet.Cells[dataRow, 2].Style.VerticalAlignment = ExcelVerticalAlignment.Center;

                    // Địa chỉ nhận
                    if (!string.IsNullOrEmpty(order.ReceiverName) || !string.IsNullOrEmpty(order.ReceiverPhone) || !string.IsNullOrEmpty(order.DeliveryAddress))
                    {
                        var receiverInfo = $"{order.ReceiverName}\n{order.ReceiverPhone}\n{order.DeliveryAddress}";
                        worksheet.Cells[dataRow, 3].Value = receiverInfo;
                    }
                    worksheet.Cells[dataRow, 3].Style.WrapText = true;
                    worksheet.Cells[dataRow, 3].Style.VerticalAlignment = ExcelVerticalAlignment.Center;

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

                    // Tài chính (Thu hộ, Cước phí, Thực nhận)
                    var financialInfo = $"Thu hộ: {order.AppliedCodAmount:#,##0}\n" +
                                      $"Cước phí: {order.AppliedFeeAmount:#,##0}\n" +
                                      $"Thực nhận: {order.NetAmount:#,##0}";
                    worksheet.Cells[dataRow, 5].Value = financialInfo;
                    worksheet.Cells[dataRow, 5].Style.WrapText = true;
                    worksheet.Cells[dataRow, 5].Style.VerticalAlignment = ExcelVerticalAlignment.Center;

                    // Border cho từng ô
                    for (int col = 1; col <= 5; col++)
                    {
                        worksheet.Cells[dataRow, col].Style.Border.Top.Style = ExcelBorderStyle.Thin;
                        worksheet.Cells[dataRow, col].Style.Border.Left.Style = ExcelBorderStyle.Thin;
                        worksheet.Cells[dataRow, col].Style.Border.Right.Style = ExcelBorderStyle.Thin;
                        worksheet.Cells[dataRow, col].Style.Border.Bottom.Style = ExcelBorderStyle.Thin;
                    }

                    dataRow++;
                }
            }
        }

        /// <summary>
        /// Định dạng worksheet danh sách đơn hàng cần đối soát
        /// </summary>
        private void FormatReconciliableOrdersWorksheet(ExcelWorksheet worksheet)
        {
            // Định dạng header (dòng 1)
            worksheet.Row(1).Height = 95;  // độ cao 95
            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 khách hàng (dòng 2-6)
            var customerInfoRange = worksheet.Cells[2, 1, 6, 5];
            customerInfoRange.Style.Border.Top.Style = ExcelBorderStyle.Thin;
            customerInfoRange.Style.Border.Bottom.Style = ExcelBorderStyle.Thin;
            customerInfoRange.Style.Border.Left.Style = ExcelBorderStyle.Thin;
            customerInfoRange.Style.Border.Right.Style = ExcelBorderStyle.Thin;

            // Định dạng header bảng đơn hàng (dòng 8) - nền đỏ
            var ordersHeaderRange = worksheet.Cells[8, 1, 8, 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(7).Height = 40; // Tiêu đề "DANH SÁCH ĐƠN HÀNG"
            worksheet.Row(8).Height = 30; // Header row

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

                var ordersDataRange = worksheet.Cells[8, 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
    }
}
