using Lada.Framework.Data.Domains.Orders;
using Lada.Framework.Data.Enums;
using Lada.Framework.DTO;
using Ladaer.BackEnd.Infrastructures.DTO;
using Ladaer.BackEnd.Infrastructures.DTO.Items.Orders;
using Ladaer.BackEnd.Infrastructures.Services.Identity;
using OfficeOpenXml;

namespace Ladaer.BackEnd.Infrastructures.Services.Orders.Exports.Templates
{
    /// <summary>
    /// Template xuất Excel cơ bản cho đơn hàng
    /// </summary>
    public class BasicOrderExportTemplate : BaseOrderExportTemplate<BasicOrderExportItem>
    {
        private readonly IUserService _userService;

        public BasicOrderExportTemplate(IUserService userService)
        {
            _userService = userService;
        }

        public override string TemplateName => "Basic";
        public override string Description => "Template xuất Excel cơ bản cho đơn hàng";
        public override string DefaultWorksheetName => "Danh sách đơn hàng";

        public override async Task<List<BasicOrderExportItem>> ConvertOrdersToExportItemsAsync(List<Order> orders)
        {
            var exportItems = new List<BasicOrderExportItem>();

            // Lấy thông tin Sale
            var saleIds = orders.Where(x => x.SaleId > 0).Select(x => x.SaleId).Distinct().ToList();
            var saleUsers = new Dictionary<int, string>();

            if (saleIds.Any())
            {
                var saleItems = await _userService.GetByListIdAsync(saleIds);
                saleUsers = saleItems.ToDictionary(s => s.Id, s => s.FullName ?? s.UserName);
            }

            foreach (var order in orders)
            {
                var exportItem = order.MapTo<Order, BasicOrderExportItem>();

                // Bổ sung thông tin Sale
                if (saleUsers.ContainsKey(order.SaleId))
                {
                    exportItem.SaleName = saleUsers[order.SaleId];
                }

                // Bổ sung thông tin địa chỉ
                var sourceAddress = order.Addresses?.FirstOrDefault(a => a.AddressType == AddressType.Source);
                var destAddress = order.Addresses?.FirstOrDefault(a => a.AddressType == AddressType.Dest);

                if (sourceAddress != null)
                {
                    exportItem.SenderName = sourceAddress.Name ?? "";
                    exportItem.SenderAddress = sourceAddress.Address1 ?? "";
                    exportItem.SenderPhone = sourceAddress.PhoneNumber1 ?? "";
                }

                if (destAddress != null)
                {
                    exportItem.ReceiverName = destAddress.Name ?? "";
                    exportItem.ReceiverAddress = destAddress.Address1 ?? "";
                    exportItem.ReceiverPhone = destAddress.PhoneNumber1 ?? "";
                }

                // Bổ sung thông tin hàng hóa
                if (order.Packages != null && order.Packages.Any())
                {
                    exportItem.TotalPackages = order.Packages.Count();
                    exportItem.TotalWeight = order.Packages.Sum(p => p.Weight);
                    exportItem.PackageContent = string.Join("; ", order.Packages.Select(p => p.Name).Where(c => !string.IsNullOrEmpty(c)));
                }

                exportItems.Add(exportItem);
            }

            return exportItems;
        }

        public override void SetupHeaders(ExcelWorksheet worksheet)
        {
            var headers = new[]
            {
                "STT", "Mã đơn hàng", "Mã đối tác", "Khách hàng", "Sale",
                "Người gửi", "Địa chỉ gửi", "SĐT gửi", "Người nhận", "Địa chỉ nhận", "SĐT nhận",
                "Trạng thái", "Trạng thái vật lý",
                "Số kiện", "Khối lượng (kg)", "KL tính cước (kg)", "Nội dung hàng",
                "Tổng cước phí", "Số tiền COD", "Loại thanh toán",
                "Thời gian tạo", "Thời gian lấy hàng", "Thời gian giao hàng", "Ghi chú"
            };

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

            // Định dạng header
            using (var range = worksheet.Cells[1, 1, 1, headers.Length])
            {
                SetupHeaderStyle(range);
            }
        }

        public override async Task FillDataAsync(ExcelWorksheet worksheet, List<BasicOrderExportItem> exportItems)
        {
            int row = 2;
            int stt = 1;

            foreach (var item in exportItems)
            {
                worksheet.Cells[row, 1].Value = stt;
                worksheet.Cells[row, 2].Value = item.OrderCode;
                worksheet.Cells[row, 3].Value = item.PartnerCode;
                worksheet.Cells[row, 4].Value = item.CustomerName;
                worksheet.Cells[row, 5].Value = item.SaleName;

                worksheet.Cells[row, 6].Value = item.SenderName;
                worksheet.Cells[row, 7].Value = item.SenderAddress;
                worksheet.Cells[row, 8].Value = item.SenderPhone;
                worksheet.Cells[row, 9].Value = item.ReceiverName;
                worksheet.Cells[row, 10].Value = item.ReceiverAddress;
                worksheet.Cells[row, 11].Value = item.ReceiverPhone;

                worksheet.Cells[row, 12].Value = item.OrderStatus;
                worksheet.Cells[row, 13].Value = item.OrderPhysicalStatus;

                worksheet.Cells[row, 14].Value = item.TotalPackages;
                worksheet.Cells[row, 15].Value = item.TotalWeightKg;
                worksheet.Cells[row, 16].Value = item.ChargeWeightKg;
                worksheet.Cells[row, 17].Value = item.PackageContent;

                worksheet.Cells[row, 18].Value = item.TotalFee;
                worksheet.Cells[row, 19].Value = item.CollectAmount;
                worksheet.Cells[row, 20].Value = item.PayFeeType;

                worksheet.Cells[row, 21].Value = item.OrderCreatedTimeFormatted;
                worksheet.Cells[row, 22].Value = item.PickupTimeFormatted;
                worksheet.Cells[row, 23].Value = item.DeliveryTimeFormatted;
                worksheet.Cells[row, 24].Value = item.Note;

                row++;
                stt++;
            }
        }

        public override void FormatWorksheet(ExcelWorksheet worksheet, int dataRowCount)
        {
            var totalRows = dataRowCount + 1; // +1 cho header
            var totalCols = 24; // Tổng số cột

            // Định dạng dữ liệu
            using (var range = worksheet.Cells[2, 1, totalRows, totalCols])
            {
                SetupDataStyle(range);
            }

            // Định dạng số cho các cột tiền tệ
            var currencyColumns = new[] { 18, 19 }; // Tổng cước phí, COD
            foreach (var col in currencyColumns)
            {
                FormatCurrencyColumn(worksheet, col, 2, totalRows);
            }

            // Định dạng số cho các cột khối lượng
            var weightColumns = new[] { 15, 16 }; // Khối lượng, KL tính cước
            foreach (var col in weightColumns)
            {
                FormatDecimalColumn(worksheet, col, 2, totalRows, 2);
            }

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

            // Đặt chiều rộng tối thiểu cho một số cột
            worksheet.Column(2).Width = 15; // Mã đơn hàng
            worksheet.Column(7).Width = 30; // Địa chỉ gửi
            worksheet.Column(10).Width = 30; // Địa chỉ nhận
            worksheet.Column(17).Width = 25; // Nội dung hàng
            worksheet.Column(24).Width = 20; // Ghi chú
        }

        public override string GetDefaultFileName(string? prefix = null)
        {
            var filePrefix = string.IsNullOrEmpty(prefix) ? "DanhSachDonHang_CoBan" : prefix;
            return $"{filePrefix}_{DateTime.Now:yyyyMMdd_HHmmss}";
        }
    }
}
