using Lada.Framework.DTO;
using Ladaer.BackEnd.Infrastructures.DTO.Models.Orders;

namespace Ladaer.BackEnd.Infrastructures.DTO.Results.Orders
{
    /// <summary>
    /// Kết quả xuất Excel đơn hàng (Generic)
    /// </summary>
    public class OrderExportResult : BaseResult
    {
        /// <summary>
        /// Loại template đã sử dụng
        /// </summary>
        public OrderExportTemplateType TemplateType { get; set; }

        /// <summary>
        /// Tên template đã sử dụng
        /// </summary>
        public string TemplateName { get; set; } = string.Empty;

        /// <summary>
        /// Đường dẫn file Excel đã tạo
        /// </summary>
        public string FilePath { get; set; } = string.Empty;

        /// <summary>
        /// Tên file Excel
        /// </summary>
        public string FileName { get; set; } = string.Empty;

        /// <summary>
        /// URL để download file (nếu có)
        /// </summary>
        public string DownloadUrl { get; set; } = string.Empty;

        /// <summary>
        /// Kích thước file (bytes)
        /// </summary>
        public long FileSize { get; set; }

        /// <summary>
        /// Số lượng đơn hàng đã xuất
        /// </summary>
        public int TotalOrders { get; set; }

        /// <summary>
        /// Số lượng đơn hàng không tìm thấy
        /// </summary>
        public int NotFoundOrders { get; set; }

        /// <summary>
        /// Danh sách mã đơn hàng không tìm thấy
        /// </summary>
        public List<string> NotFoundOrderCodes { get; set; } = new List<string>();

        /// <summary>
        /// Danh sách ID đơn hàng không tìm thấy
        /// </summary>
        public List<int> NotFoundOrderIds { get; set; } = new List<int>();

        /// <summary>
        /// Thời gian bắt đầu xử lý
        /// </summary>
        public DateTimeOffset ProcessStartTime { get; set; } = DateTimeOffset.Now;

        /// <summary>
        /// Thời gian hoàn thành xử lý
        /// </summary>
        public DateTimeOffset ProcessEndTime { get; set; }

        /// <summary>
        /// Thời gian xử lý (milliseconds)
        /// </summary>
        public long ProcessingTimeMs => (long)(ProcessEndTime - ProcessStartTime).TotalMilliseconds;

        /// <summary>
        /// Thời gian tạo file
        /// </summary>
        public DateTimeOffset CreatedTime { get; set; } = DateTimeOffset.Now;

        /// <summary>
        /// Thông tin chi tiết về quá trình xử lý
        /// </summary>
        public OrderExportProcessInfo ProcessInfo { get; set; } = new OrderExportProcessInfo();

        /// <summary>
        /// Thông tin tóm tắt kết quả
        /// </summary>
        public string Summary => $"Đã xuất {TotalOrders} đơn hàng bằng template {TemplateName}. " +
                                $"{(NotFoundOrders > 0 ? $"Không tìm thấy {NotFoundOrders} đơn hàng. " : "")}" +
                                $"Thời gian xử lý: {ProcessingTimeMs}ms.";

        /// <summary>
        /// Đánh dấu hoàn thành xử lý
        /// </summary>
        public void MarkProcessCompleted()
        {
            ProcessEndTime = DateTimeOffset.Now;
        }
    }

    /// <summary>
    /// Thông tin chi tiết về quá trình xuất Excel
    /// </summary>
    public class OrderExportProcessInfo
    {
        /// <summary>
        /// Thời gian query database (ms)
        /// </summary>
        public long DatabaseQueryTimeMs { get; set; }

        /// <summary>
        /// Thời gian chuyển đổi dữ liệu (ms)
        /// </summary>
        public long DataConversionTimeMs { get; set; }

        /// <summary>
        /// Thời gian tạo file Excel (ms)
        /// </summary>
        public long ExcelGenerationTimeMs { get; set; }

        /// <summary>
        /// Số lượng bản ghi đã xử lý
        /// </summary>
        public int ProcessedRecords { get; set; }

        /// <summary>
        /// Số lượng cột trong Excel
        /// </summary>
        public int ExcelColumns { get; set; }

        /// <summary>
        /// Số lượng dòng trong Excel (bao gồm header)
        /// </summary>
        public int ExcelRows { get; set; }

        /// <summary>
        /// Memory usage peak (bytes)
        /// </summary>
        public long PeakMemoryUsage { get; set; }

        /// <summary>
        /// Các cảnh báo trong quá trình xử lý
        /// </summary>
        public List<string> Warnings { get; set; } = new List<string>();

        /// <summary>
        /// Thông tin debug (chỉ trong development)
        /// </summary>
        public Dictionary<string, object> DebugInfo { get; set; } = new Dictionary<string, object>();

        /// <summary>
        /// Tổng thời gian xử lý (ms)
        /// </summary>
        public long TotalProcessingTimeMs => DatabaseQueryTimeMs + DataConversionTimeMs + ExcelGenerationTimeMs;
    }

    /// <summary>
    /// Kết quả xuất Excel với thông tin template cụ thể
    /// </summary>
    /// <typeparam name="TExportItem">Loại DTO export</typeparam>
    public class OrderExportResult<TExportItem> : OrderExportResult where TExportItem : class
    {
        /// <summary>
        /// Danh sách items đã xuất (để debug hoặc preview)
        /// </summary>
        public List<TExportItem>? ExportedItems { get; set; }

        /// <summary>
        /// Metadata về các cột đã xuất
        /// </summary>
        public List<ExportColumnInfo> ColumnInfo { get; set; } = new List<ExportColumnInfo>();
    }

    /// <summary>
    /// Thông tin về cột trong file Excel
    /// </summary>
    public class ExportColumnInfo
    {
        /// <summary>
        /// Tên cột
        /// </summary>
        public string ColumnName { get; set; } = string.Empty;

        /// <summary>
        /// Index cột (1-based)
        /// </summary>
        public int ColumnIndex { get; set; }

        /// <summary>
        /// Loại dữ liệu
        /// </summary>
        public string DataType { get; set; } = string.Empty;

        /// <summary>
        /// Định dạng hiển thị
        /// </summary>
        public string Format { get; set; } = string.Empty;

        /// <summary>
        /// Chiều rộng cột
        /// </summary>
        public double Width { get; set; }

        /// <summary>
        /// Có phải cột bắt buộc không
        /// </summary>
        public bool IsRequired { get; set; }

        /// <summary>
        /// Mô tả cột
        /// </summary>
        public string Description { get; set; } = string.Empty;
    }
}
