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 Ladaer.BackEnd.Infrastructures.DTO.Models.Finance;
using Ladaer.BackEnd.Infrastructures.DTO.Results.Finance;
using Ladaer.BackEnd.Infrastructures.Services.Finance;
using Microsoft.EntityFrameworkCore;
using OfficeOpenXml;
using OfficeOpenXml.Style;
using System.Drawing;

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

        /// <summary>
        /// Xuất Excel chi tiết phiếu đối soát
        /// </summary>
        /// <param name="reconciliationId">ID phiếu đối soát</param>
        /// <param name="model">Model xuất Excel</param>
        /// <returns>Kết quả xuất file</returns>
        Task<ReconciliationExcelExportResult> ExportReconciliationDetailAsync(int reconciliationId, ReconciliationExcelExportModel model);
    }

    /// <summary>
    /// Dịch vụ xuất Excel phiếu đối soát
    /// </summary>
    public class ReconciliationExcelService : IReconciliationExcelService
    {
        private readonly IRepository<Reconciliation> _reconciliationRepository;
        private readonly IRepository<ReconciliationOrder> _reconciliationOrderRepository;
        private readonly IRepository<Customer> _customerRepository;
        private readonly IRepository<Order> _orderRepository;
        private readonly IExcelFileService _excelFileService;

        public ReconciliationExcelService(
            IRepository<Reconciliation> reconciliationRepository,
            IRepository<ReconciliationOrder> reconciliationOrderRepository,
            IRepository<Customer> customerRepository,
            IRepository<Order> orderRepository,
            IExcelFileService excelFileService)
        {
            _reconciliationRepository = reconciliationRepository;
            _reconciliationOrderRepository = reconciliationOrderRepository;
            _customerRepository = customerRepository;
            _orderRepository = orderRepository;
            _excelFileService = excelFileService;
        }

        /// <summary>
        /// Xuất Excel danh sách phiếu đối soát
        /// </summary>
        public async Task<ReconciliationExcelExportResult> ExportReconciliationsAsync(ReconciliationExcelExportModel model)
        {
            var result = new ReconciliationExcelExportResult
            {
                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 reconciliations = await GetReconciliationsDataAsync(model);

                // Tạo file Excel
                var excelPackage = await CreateReconciliationExcelPackageAsync(reconciliations, model);

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

                // Lưu file sử dụng ExcelFileService
                var saveResult = await _excelFileService.SaveExcelFileAsync(
                    excelPackage, 
                    fileName, 
                    "reconciliations",
                    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 = reconciliations.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
        /// </summary>
        public async Task<ReconciliationExcelExportResult> ExportReconciliationDetailAsync(int reconciliationId, ReconciliationExcelExportModel model)
        {
            var result = new ReconciliationExcelExportResult
            {
                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 reconciliationDetail = await GetReconciliationDetailDataAsync(reconciliationId);

                if (reconciliationDetail == 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 CreateReconciliationDetailExcelPackageAsync(reconciliationDetail, model);

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

                // Lưu file sử dụng ExcelFileService
                var saveResult = await _excelFileService.SaveExcelFileAsync(
                    excelPackage, 
                    fileName, 
                    "reconciliations",
                    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 đối soát
        /// </summary>
        private async Task<List<Reconciliation>> GetReconciliationsDataAsync(ReconciliationExcelExportModel model)
        {
            var query = _reconciliationRepository.Query()
                .Include(r => r.Customer)
                .Include(r => r.Orders)
                    .ThenInclude(ro => ro.Order)
                    .ThenInclude(o => o.Addresses)
                .Include(r => r.Orders)
                    .ThenInclude(ro => ro.Order)
                    .ThenInclude(o => o.Packages)
                .Include(r => r.Orders)
                    .ThenInclude(ro => ro.Order)
                    .ThenInclude(o => o.OrderFin)
                .AsQueryable();

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

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

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

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

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

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

        /// <summary>
        /// Lấy dữ liệu chi tiết phiếu đối soát
        /// </summary>
        private async Task<Reconciliation?> GetReconciliationDetailDataAsync(int reconciliationId)
        {
            return await _reconciliationRepository.Query()
                .Include(r => r.Customer)
                .Include(r => r.Orders)
                    .ThenInclude(ro => ro.Order)
                    .ThenInclude(o => o.Addresses)
                .Include(r => r.Orders)
                    .ThenInclude(ro => ro.Order)
                    .ThenInclude(o => o.Packages)
                .Include(r => r.Orders)
                    .ThenInclude(ro => ro.Order)
                    .ThenInclude(o => o.OrderFin)
                .Include(r => r.Transaction)
                .FirstOrDefaultAsync(r => r.Id == reconciliationId);
        }

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

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

            // Điền dữ liệu
            FillReconciliationData(worksheet, reconciliations);

            // Định dạng worksheet
            FormatReconciliationWorksheet(worksheet, reconciliations.Count);

            return Task.FromResult(package);
        }

        /// <summary>
        /// Tạo ExcelPackage chi tiết phiếu đối soát
        /// </summary>
        private Task<ExcelPackage> CreateReconciliationDetailExcelPackageAsync(Reconciliation reconciliationDetail, ReconciliationExcelExportModel 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 đố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
            AddReconciliationGeneralInfo(worksheet, reconciliationDetail);
            
            // Chi tiết đơn hàng
            AddReconciliationOrdersDetail(worksheet, reconciliationDetail);
            
            // Định dạng worksheet
            FormatReconciliationDetailWorksheet(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 (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;
            
            
            // Tạo rich text với font khác nhau cho thông tin công ty
            var richText = companyCell.RichText.Add("CÔ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.659");
            richText.Bold = false;
            richText.Size = 10;

            // Dòng 1: Tiêu đề PHIẾU ĐỐI SOÁT (cột D-G)
            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 AddReconciliationGeneralInfo(ExcelWorksheet worksheet, Reconciliation reconciliation)
        {
            // Dòng 2: Mã phiếu đối soát (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 đối soát:";
            worksheet.Cells[2, 2].Value = reconciliation.Code;
            
            worksheet.Cells[2, 4].Style.VerticalAlignment = ExcelVerticalAlignment.Center;
            worksheet.Cells[2, 4].Value = "Tổng tiền thu hộ:";
            worksheet.Cells[2, 5].Value = reconciliation.TotalCodAmount;
            worksheet.Cells[2, 5].Style.Numberformat.Format = "#,##0 ₫";

            // 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 = reconciliation.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 = reconciliation.TotalFeeAmount;
            worksheet.Cells[3, 5].Style.Numberformat.Format = "#,##0 ₫";

            // Dòng 4: Trống (cột A-B) và Số tiền thực nhận (cột D-E)
            worksheet.Cells[4, 4].Style.VerticalAlignment = ExcelVerticalAlignment.Center;
            worksheet.Cells[4, 4].Value = "Số tiền thực nhận:";
            worksheet.Cells[4, 5].Value = reconciliation.NetAmount;
            worksheet.Cells[4, 5].Style.Numberformat.Format = "#,##0 ₫";
        }

        /// <summary>
        /// Thêm chi tiết đơn hàng
        /// </summary>
        private void AddReconciliationOrdersDetail(ExcelWorksheet worksheet, Reconciliation reconciliation)
        {
            // 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 (reconciliation.Orders != null && reconciliation.Orders.Any())
            {
                foreach (var reconciliationOrder in reconciliation.Orders)
                {
                    var order = reconciliationOrder.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 $"Thu hộ: {collectAmount:N0}\nCước phí: {totalFee:N0}\nThực nhận: {actualAmount:N0}";
            }
            return "";
        }

        /// <summary>
        /// Định dạng worksheet chi tiết phiếu đối soát
        /// </summary>
        private void FormatReconciliationDetailWorksheet(ExcelWorksheet worksheet)
        {
            // Định dạng header (dòng 1)
            worksheet.Row(1).Height = 60;  // độ cao 40
            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 (chỉ 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 đối soát
        /// </summary>
        private void SetupReconciliationHeaders(ExcelWorksheet worksheet)
        {
            var headers = new[]
            {
                "STT", "Mã phiếu đối soát", "Khách hàng", "Ngày tạo", "Người tạo",
                "Tổng tiền", "Trạng thái", "Ngày xác nhận", "Người xác nhận",
                "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 đối soát
        /// </summary>
        private void FillReconciliationData(ExcelWorksheet worksheet, List<Reconciliation> reconciliations)
        {
            int row = 2; // Bắt đầu từ dòng 2 (dòng 1 là header)
            
            foreach (var reconciliation in reconciliations)
            {
                worksheet.Cells[row, 1].Value = row - 1; // STT
                worksheet.Cells[row, 2].Value = reconciliation.Code; // Mã phiếu đối soát
                worksheet.Cells[row, 3].Value = reconciliation.Customer?.FullName ?? ""; // Khách hàng
                worksheet.Cells[row, 4].Value = reconciliation.CreatedTime?.ToString("dd/MM/yyyy HH:mm") ?? ""; // Ngày tạo
                worksheet.Cells[row, 5].Value = reconciliation.CreatedByUserName ?? ""; // Người tạo
                worksheet.Cells[row, 6].Value = reconciliation.NetAmount; // Tổng tiền
                worksheet.Cells[row, 7].Value = GetStatusDescription(reconciliation.Status); // Trạng thái
                worksheet.Cells[row, 8].Value = reconciliation.UpdatedTime?.ToString("dd/MM/yyyy HH:mm") ?? ""; // Ngày cập nhật
                worksheet.Cells[row, 9].Value = reconciliation.UpdatedByUserName ?? ""; // Người cập nhật
                worksheet.Cells[row, 10].Value = reconciliation.TransferDate?.ToString("dd/MM/yyyy HH:mm") ?? ""; // Ngày chuyển khoản
                worksheet.Cells[row, 11].Value = reconciliation.TransferredByUsername ?? ""; // Người chuyển khoản
                worksheet.Cells[row, 12].Value = reconciliation.Note ?? ""; // Ghi chú
                
                row++;
            }
        }


        /// <summary>
        /// Định dạng worksheet danh sách phiếu đối soát
        /// </summary>
        private void FormatReconciliationWorksheet(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.LightBlue);
            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(ReconciliationStatus status)
        {
            return status switch
            {
                ReconciliationStatus.Draft => "Nháp",
                ReconciliationStatus.Confirmed => "Đã xác nhận",
                ReconciliationStatus.Transferred => "Đã chuyển tiền",
                ReconciliationStatus.Cancelled => "Đã hủy",
                _ => status.ToString()
            };
        }

        #endregion
    }
}
