using Lada.Framework.DTO;

namespace Ladaer.BackEnd.Infrastructures.DTO.Models.Orders
{
    /// <summary>
    /// Enum định nghĩa các loại template xuất Excel
    /// </summary>
    public enum OrderExportTemplateType
    {
        /// <summary>
        /// Template cho tài chính - TransferPaymentBill
        /// </summary>
        Finance = 1,

        /// <summary>
        /// Template cho vận hành - Operations
        /// </summary>
        Operations = 2,

        /// <summary>
        /// Template cho logistics - Pickup/Delivery
        /// </summary>
        Logistics = 3,

        /// <summary>
        /// Template cho báo cáo - Reporting
        /// </summary>
        Reporting = 4,

        /// <summary>
        /// Template cho khách hàng - Customer view
        /// </summary>
        Customer = 5,

        /// <summary>
        /// Template cơ bản - Basic info
        /// </summary>
        Basic = 6,

        /// <summary>
        /// Template đầy đủ - All information
        /// </summary>
        Full = 7,

        /// <summary>
        /// Template tùy chỉnh
        /// </summary>
        Custom = 99
    }

    /// <summary>
    /// Model chung cho việc xuất Excel đơn hàng
    /// </summary>
    public class OrderExportModel : BaseModel<int>
    {
        /// <summary>
        /// Loại template xuất
        /// </summary>
        public OrderExportTemplateType TemplateType { get; set; } = OrderExportTemplateType.Basic;

        /// <summary>
        /// Danh sách ID đơn hàng cần xuất
        /// </summary>
        public List<int> OrderIds { get; set; } = new List<int>();

        /// <summary>
        /// Danh sách mã đơn hàng cần xuất
        /// </summary>
        public List<string> OrderCodes { get; set; } = new List<string>();

        /// <summary>
        /// Tên file Excel (không bao gồm extension)
        /// </summary>
        public string FileName { get; set; } = string.Empty;

        /// <summary>
        /// Đường dẫn thư mục lưu file (tùy chọn)
        /// </summary>
        public string? FolderPath { get; set; }

        /// <summary>
        /// Tên worksheet (tùy chọn, sẽ dùng default của template nếu không có)
        /// </summary>
        public string? WorksheetName { get; set; }

        /// <summary>
        /// Có bao gồm thông tin hàng hóa chi tiết không
        /// </summary>
        public bool IncludePackageDetails { get; set; } = true;

        /// <summary>
        /// Có bao gồm thông tin địa chỉ chi tiết không
        /// </summary>
        public bool IncludeAddressDetails { get; set; } = true;

        /// <summary>
        /// Có bao gồm thông tin tài chính chi tiết không
        /// </summary>
        public bool IncludeFinanceDetails { get; set; } = true;

        /// <summary>
        /// Có bao gồm thông tin thời gian chi tiết không
        /// </summary>
        public bool IncludeTimeDetails { get; set; } = true;

        /// <summary>
        /// Có bao gồm thông tin tracking không
        /// </summary>
        public bool IncludeTrackingDetails { get; set; } = false;

        /// <summary>
        /// Có bao gồm thông tin media/hình ảnh không
        /// </summary>
        public bool IncludeMediaDetails { get; set; } = false;

        /// <summary>
        /// Các tùy chọn bổ sung (JSON format)
        /// </summary>
        public string? AdditionalOptions { get; set; }

        /// <summary>
        /// Validate model
        /// </summary>
        /// <returns>Danh sách lỗi validation</returns>
        public List<string> Validate()
        {
            var errors = new List<string>();

            if ((OrderIds == null || !OrderIds.Any()) && 
                (OrderCodes == null || !OrderCodes.Any()))
            {
                errors.Add("Vui lòng cung cấp danh sách OrderId hoặc OrderCode");
            }

            if (OrderIds != null && OrderIds.Any() && OrderIds.Any(id => id <= 0))
            {
                errors.Add("OrderId phải lớn hơn 0");
            }

            if (OrderCodes != null && OrderCodes.Any() && OrderCodes.Any(string.IsNullOrWhiteSpace))
            {
                errors.Add("OrderCode không được để trống");
            }

            return errors;
        }

        /// <summary>
        /// Lấy tên template dạng string
        /// </summary>
        /// <returns>Tên template</returns>
        public string GetTemplateTypeName()
        {
            return TemplateType switch
            {
                OrderExportTemplateType.Finance => "Finance",
                OrderExportTemplateType.Operations => "Operations",
                OrderExportTemplateType.Logistics => "Logistics",
                OrderExportTemplateType.Reporting => "Reporting",
                OrderExportTemplateType.Customer => "Customer",
                OrderExportTemplateType.Basic => "Basic",
                OrderExportTemplateType.Full => "Full",
                OrderExportTemplateType.Custom => "Custom",
                _ => "Unknown"
            };
        }
    }

    /// <summary>
    /// Model cho việc xuất Excel với filter nâng cao
    /// </summary>
    public class OrderExportWithFilterModel : OrderExportModel
    {
        /// <summary>
        /// Lọc theo khách hàng
        /// </summary>
        public List<int>? CustomerIds { get; set; }

        /// <summary>
        /// Lọc theo sale
        /// </summary>
        public List<int>? SaleIds { get; set; }

        /// <summary>
        /// Lọc theo trạng thái đơn hàng
        /// </summary>
        public List<string>? OrderStatuses { get; set; }

        /// <summary>
        /// Lọc theo trạng thái vật lý
        /// </summary>
        public List<string>? PhysicalStatuses { get; set; }

        /// <summary>
        /// Lọc theo ngày tạo từ
        /// </summary>
        public DateTimeOffset? CreatedFromDate { get; set; }

        /// <summary>
        /// Lọc theo ngày tạo đến
        /// </summary>
        public DateTimeOffset? CreatedToDate { get; set; }

        /// <summary>
        /// Lọc theo ngày lấy hàng từ
        /// </summary>
        public DateTimeOffset? PickupFromDate { get; set; }

        /// <summary>
        /// Lọc theo ngày lấy hàng đến
        /// </summary>
        public DateTimeOffset? PickupToDate { get; set; }

        /// <summary>
        /// Lọc theo ngày giao hàng từ
        /// </summary>
        public DateTimeOffset? DeliveryFromDate { get; set; }

        /// <summary>
        /// Lọc theo ngày giao hàng đến
        /// </summary>
        public DateTimeOffset? DeliveryToDate { get; set; }

        /// <summary>
        /// Lọc theo tuyến
        /// </summary>
        public List<int>? RouteIds { get; set; }

        /// <summary>
        /// Lọc theo agency
        /// </summary>
        public List<int>? AgencyIds { get; set; }

        /// <summary>
        /// Từ khóa tìm kiếm (mã đơn, tên khách hàng, sdt)
        /// </summary>
        public string? SearchKeyword { get; set; }

        /// <summary>
        /// Validate model với filter
        /// </summary>
        /// <returns>Danh sách lỗi validation</returns>
        public new List<string> Validate()
        {
            var errors = base.Validate();

            // Nếu có filter thì không bắt buộc phải có OrderIds/OrderCodes
            if ((OrderIds == null || !OrderIds.Any()) && 
                (OrderCodes == null || !OrderCodes.Any()) &&
                !HasAnyFilter())
            {
                errors.Clear();
                errors.Add("Vui lòng cung cấp danh sách OrderId/OrderCode hoặc các điều kiện lọc");
            }

            if (CreatedFromDate.HasValue && CreatedToDate.HasValue && CreatedFromDate > CreatedToDate)
            {
                errors.Add("Ngày tạo từ không được lớn hơn ngày tạo đến");
            }

            if (PickupFromDate.HasValue && PickupToDate.HasValue && PickupFromDate > PickupToDate)
            {
                errors.Add("Ngày lấy hàng từ không được lớn hơn ngày lấy hàng đến");
            }

            if (DeliveryFromDate.HasValue && DeliveryToDate.HasValue && DeliveryFromDate > DeliveryToDate)
            {
                errors.Add("Ngày giao hàng từ không được lớn hơn ngày giao hàng đến");
            }

            return errors;
        }

        /// <summary>
        /// Kiểm tra có filter nào không
        /// </summary>
        /// <returns>True nếu có filter</returns>
        private bool HasAnyFilter()
        {
            return (CustomerIds != null && CustomerIds.Any()) ||
                   (SaleIds != null && SaleIds.Any()) ||
                   (OrderStatuses != null && OrderStatuses.Any()) ||
                   (PhysicalStatuses != null && PhysicalStatuses.Any()) ||
                   CreatedFromDate.HasValue ||
                   CreatedToDate.HasValue ||
                   PickupFromDate.HasValue ||
                   PickupToDate.HasValue ||
                   DeliveryFromDate.HasValue ||
                   DeliveryToDate.HasValue ||
                   (RouteIds != null && RouteIds.Any()) ||
                   (AgencyIds != null && AgencyIds.Any()) ||
                   !string.IsNullOrWhiteSpace(SearchKeyword);
        }
    }
}
