using AutoMapper;
using Lada.Framework.Data.Domains.Categories;
using Lada.Framework.Data.Domains.Cms;
using Lada.Framework.Data.Domains.Crm;
using Lada.Framework.Data.Domains.Finance;
using Lada.Framework.Data.Domains.Finance.Quotations;
using Lada.Framework.Data.Domains.Finance.Wallets;
using Lada.Framework.Data.Domains.Hr;
using Lada.Framework.Data.Domains.Identity;
using Lada.Framework.Data.Domains.Orders;
using Lada.Framework.Data.Domains.Rewards;
using Lada.Framework.Data.Domains.Settings;
using Lada.Framework.Data.Domains.Trucks;
using Lada.Framework.Data.Enums;
using Lada.Framework.Infrastructures.Services;
using Ladaer.BackEnd.Infrastructures.DTO.Items.Business.Operations;
using Ladaer.BackEnd.Infrastructures.DTO.Items.Categories;
using Ladaer.BackEnd.Infrastructures.DTO.Items.Cms;
using Ladaer.BackEnd.Infrastructures.DTO.Items.Crm;
using Ladaer.BackEnd.Infrastructures.DTO.Items.DriverApp;
using Ladaer.BackEnd.Infrastructures.DTO.Items.Finance;
using Ladaer.BackEnd.Infrastructures.DTO.Items.Finances;
using Ladaer.BackEnd.Infrastructures.DTO.Items.FuelCards;
using Ladaer.BackEnd.Infrastructures.DTO.Items.Hr;
using Ladaer.BackEnd.Infrastructures.DTO.Items.Identity;
using Ladaer.BackEnd.Infrastructures.DTO.Items.Orders;
using Ladaer.BackEnd.Infrastructures.DTO.Items.Rewards;
using Ladaer.BackEnd.Infrastructures.DTO.Items.Settings;
using Ladaer.BackEnd.Infrastructures.DTO.Items.Trucks;
using Ladaer.BackEnd.Infrastructures.DTO.Models.Categories;
using Ladaer.BackEnd.Infrastructures.DTO.Models.Cms;
using Ladaer.BackEnd.Infrastructures.DTO.Models.Crm;
using Ladaer.BackEnd.Infrastructures.DTO.Models.DriverApp;
using Ladaer.BackEnd.Infrastructures.DTO.Models.Finance;
using Ladaer.BackEnd.Infrastructures.DTO.Models.Finances;
using Ladaer.BackEnd.Infrastructures.DTO.Models.Hr;
using Ladaer.BackEnd.Infrastructures.DTO.Models.Itentity;
using Ladaer.BackEnd.Infrastructures.DTO.Models.Orders;
using Ladaer.BackEnd.Infrastructures.DTO.Models.Orders.Detail;
using Ladaer.BackEnd.Infrastructures.DTO.Models.Orders.Shared;
using Ladaer.BackEnd.Infrastructures.DTO.Models.Rewards;
using Ladaer.BackEnd.Infrastructures.DTO.Models.Settings;
using Ladaer.BackEnd.Infrastructures.DTO.Models.Trucks;
using Ladaer.BackEnd.Infrastructures.DTO.Models.Users;
using Ladaer.BackEnd.Infrastructures.DTO.Profiles;
using Route = Lada.Framework.Data.Domains.Finance.Quotations.Route;

namespace Ladaer.BackEnd.Infrastructures.DTO
{
    /// <summary>
    /// Lớp mở rộng cho các phương thức ánh xạ giữa các đối tượng.
    /// </summary>
    public static class MappingExtensions
    {
        public static MapperConfiguration MapperConfiguration;

        /// <summary>
        /// Ánh xạ từ đối tượng nguồn sang đối tượng đích.
        /// </summary>
        /// <typeparam name="TSource">Loại của đối tượng nguồn.</typeparam>
        /// <typeparam name="TDestination">Loại của đối tượng đích.</typeparam>
        /// <param name="source">Đối tượng nguồn.</param>
        /// <returns>Đối tượng đích.</returns>
        public static TDestination MapTo<TSource, TDestination>(this TSource source)
        {
            return AutoMapperConfig.Mapper.Map<TSource, TDestination>(source);
        }

        /// <summary>
        /// Ánh xạ từ đối tượng nguồn sang đối tượng đích đã tồn tại.
        /// </summary>
        /// <typeparam name="TSource">Loại của đối tượng nguồn.</typeparam>
        /// <typeparam name="TDestination">Loại của đối tượng đích.</typeparam>
        /// <param name="source">Đối tượng nguồn.</param>
        /// <param name="destination">Đối tượng đích đã tồn tại.</param>
        /// <returns>Đối tượng đích đã được cập nhật.</returns>
        public static TDestination MapTo<TSource, TDestination>(this TSource source, TDestination destination)
        {
            return AutoMapperConfig.Mapper.Map(source, destination);
        }

        #region Categories - Compatibility Extensions (delegating to CategoriesMappingProfile)
        // Location extensions
        public static LocationModel ToModel(this Location entity)
            => CategoriesMappingExtensions.ToModel(entity);

        public static LocationItem ToItem(this Location entity)
            => CategoriesMappingExtensions.ToItem(entity);

        public static SugLocationItem ToSugItem(this Location entity)
            => CategoriesMappingExtensions.ToSugItem(entity);

        public static Location ToEntity(this LocationModel model)
            => CategoriesMappingExtensions.ToEntity(model);

        // Menu extensions
        public static MenuModel ToModel(this Menu entity)
            => CategoriesMappingExtensions.ToModel(entity);

        public static MenuItem ToItem(this Menu entity)
            => CategoriesMappingExtensions.ToItem(entity);

        public static MenuTreeItem ToTreeItem(this Menu entity)
            => CategoriesMappingExtensions.ToTreeItem(entity);

        public static Menu ToEntity(this MenuModel model)
            => CategoriesMappingExtensions.ToEntity(model);

        // Route extensions
        public static RouteModel ToModel(this Route entity)
            => CategoriesMappingExtensions.ToModel(entity);

        public static RouteItem ToItem(this Route entity)
            => CategoriesMappingExtensions.ToItem(entity);

        public static Route ToEntity(this RouteModel model)
            => CategoriesMappingExtensions.ToEntity(model);

        // EndPoints extensions
        public static EndPointsModel ToModel(this EndPoints entity)
            => CategoriesMappingExtensions.ToModel(entity);

        public static EndPointsItem ToItem(this EndPoints entity)
            => CategoriesMappingExtensions.ToItem(entity);

        public static EndPoints ToEntity(this EndPointsModel model)
            => CategoriesMappingExtensions.ToEntity(model);

        #endregion

        // Đã tách CRM extensions sang CrmMappingProfile.cs
        // Đã tách Orders extensions sang OrdersMappingProfile.cs

        #region Finance - Compatibility Extensions (delegating to FinanceMappingProfile)
        /// <summary>
        /// Chuyển đổi đối tượng Expense sang ExpenseItem.
        /// </summary>
        public static ExpenseItem ToItem(this Expense entity)
        {
            return FinanceMappingExtensions.ToItem(entity);
        }

        /// <summary>
        /// Chuyển đổi đối tượng Expense sang ExpenseModel.
        /// </summary>
        public static ExpenseModel ToModel(this Expense entity)
        {
            return FinanceMappingExtensions.ToModel(entity);
        }

        /// <summary>
        /// Chuyển đổi đối tượng BankAccount sang BankAccountItem.
        /// </summary>
        public static BankAccountItem ToItem(this BankAccount entity)
        {
            return FinanceMappingExtensions.ToItem(entity);
        }

        /// <summary>
        /// Chuyển đổi đối tượng BankTransaction sang BankTransactionItem.
        /// </summary>
        public static BankTransactionItem ToItem(this BankTransaction entity)
        {
            return FinanceMappingExtensions.ToItem(entity);
        }

        /// <summary>
        /// Chuyển đổi đối tượng BankStatementImport sang BankStatementImportItem.
        /// </summary>
        public static BankStatementImportItem ToItem(this BankStatementImport entity)
        {
            return FinanceMappingExtensions.ToItem(entity);
        }

        /// <summary>
        /// Chuyển đổi đối tượng VatInvoice sang VatInvoiceItem.
        /// </summary>
        public static VatInvoiceItem ToItem(this VatInvoice entity)
        {
            return entity.MapTo<VatInvoice, VatInvoiceItem>();
        }

        /// <summary>
        /// Chuyển đổi đối tượng VatInvoiceModel sang VatInvoice.
        /// </summary>
        public static VatInvoice ToEntity(this VatInvoiceModel model)
        {
            return model.MapTo<VatInvoiceModel, VatInvoice>();
        }
        #endregion

        #region CRM - Compatibility Extensions (delegating to CrmMappingProfile)
        /// <summary>
        /// Chuyển đổi đối tượng Agency sang AgencyModel.
        /// </summary>
        public static AgencyModel ToModel(this Agency entity)
        {
            return CrmMappingExtensions.ToModel(entity);
        }

        /// <summary>
        /// Chuyển đổi đối tượng Agency sang AgencyItem.
        /// </summary>
        public static AgencyItem ToItem(this Agency entity)
        {
            return CrmMappingExtensions.ToItem(entity);
        }

        /// <summary>
        /// Chuyển đổi đối tượng AgencyModel sang Agency.
        /// </summary>
        public static Agency ToEntity(this AgencyModel model)
        {
            return CrmMappingExtensions.ToEntity(model);
        }

        /// <summary>
        /// Chuyển đổi danh sách đối tượng Agency sang danh sách AgencyItem.
        /// </summary>
        public static List<AgencyItem> ToItem(this List<Agency> entity)
        {
            return CrmMappingExtensions.ToItem(entity);
        }

        /// <summary>
        /// Chuyển đổi đối tượng Customer sang CustomerModel.
        /// </summary>
        public static CustomerModel ToModel(this Customer entity)
        {
            return CrmMappingExtensions.ToModel(entity);
        }

        /// <summary>
        /// Chuyển đổi đối tượng Customer sang CustomerItem.
        /// </summary>
        public static CustomerItem ToItem(this Customer entity)
        {
            return CrmMappingExtensions.ToItem(entity);
        }

        /// <summary>
        /// Chuyển đổi đối tượng Customer sang CustomerSugItem.
        /// </summary>
        public static CustomerSugItem ToSugItem(this Customer entity)
        {
            return CrmMappingExtensions.ToSugItem(entity);
        }

        /// <summary>
        /// Chuyển đổi đối tượng CustomerModel sang Customer.
        /// </summary>
        public static Customer ToEntity(this CustomerModel model)
        {
            return CrmMappingExtensions.ToEntity(model);
        }

        /// <summary>
        /// Chuyển đổi đối tượng CustomerAddress sang CustomerAddressModel.
        /// </summary>
        public static CustomerAddressModel ToModel(this CustomerAddress entity)
        {
            return CrmMappingExtensions.ToModel(entity);
        }

        /// <summary>
        /// Chuyển đổi đối tượng CustomerAddress sang CustomerAddressItem.
        /// </summary>
        public static CustomerAddressItem ToItem(this CustomerAddress entity)
        {
            return CrmMappingExtensions.ToItem(entity);
        }

        /// <summary>
        /// Chuyển đổi đối tượng CustomerAddressModel sang CustomerAddress.
        /// </summary>
        public static CustomerAddress ToEntity(this CustomerAddressModel model)
        {
            return CrmMappingExtensions.ToEntity(model);
        }

        /// <summary>
        /// Chuyển đổi đối tượng Lead sang LeadModel.
        /// </summary>
        public static Lead ToEntity(this LeadModel model)
        {
            return CrmMappingExtensions.ToEntity(model);
        }

        public static LeadItem ToItem(this Lead model)
        {
            return CrmMappingExtensions.ToItem(model);
        }
        public static LeadStatusModel ToStatusModel(this Lead model)
        {
            return CrmMappingExtensions.ToStatusModel(model);
        }
        #endregion

        #region Identity - Compatibility Extensions (delegating to IdentityMappingProfile)
        /// <summary>
        /// Chuyển đổi đối tượng User sang UserOptionItem.
        /// </summary>
        public static UserOptionItem ToOptionItem(this User entity)
        {
            return IdentityMappingExtensions.ToOptionItem(entity);
        }

        /// <summary>
        /// Chuyển đổi đối tượng User sang StaffItem.
        /// </summary>
        public static StaffItem ToStaffItem(this User entity)
        {
            return IdentityMappingExtensions.ToStaffItem(entity);
        }

        /// <summary>
        /// Chuyển đổi đối tượng User sang StaffModel.
        /// </summary>
        public static StaffModel ToStaffModel(this User entity)
        {
            return IdentityMappingExtensions.ToStaffModel(entity);
        }

        /// <summary>
        /// Chuyển đổi đối tượng Role sang RoleItem.
        /// </summary>
        public static RoleItem ToItem(this Role entity)
        {
            return IdentityMappingExtensions.ToItem(entity);
        }

        /// <summary>
        /// Chuyển đổi đối tượng Role sang RoleModel.
        /// </summary>
        public static RoleModel ToModel(this Role entity)
        {
            return IdentityMappingExtensions.ToModel(entity);
        }
        #endregion

        #region Orders - Compatibility Extensions (delegating to OrdersMappingProfile)
        /// <summary>
        /// Chuyển đổi đối tượng OrderAddressModel sang OrderAddress.
        /// </summary>
        public static OrderAddress ToEntity(this OrderAddressModel entity)
        {
            return OrdersMappingExtensions.ToEntity(entity);
        }

        /// <summary>
        /// Chuyển đổi đối tượng OrderAddress sang OrderAddressModel.
        /// </summary>
        public static OrderAddressModel ToModel(this OrderAddress entity)
        {
            return OrdersMappingExtensions.ToModel(entity);
        }

        /// <summary>
        /// Chuyển đổi đối tượng OrderAddress sang UpdateOrderAddressModel.
        /// </summary>
        public static UpdateOrderAddressModel ToUpdateModel(this OrderAddress entity)
        {
            return OrdersMappingExtensions.ToUpdateModel(entity);
        }

        /// <summary>
        /// Chuyển đổi đối tượng OrderAddress sang OrderAddressItem.
        /// </summary>
        public static OrderAddressItem ToItem(this OrderAddress entity)
        {
            return OrdersMappingExtensions.ToItem(entity);
        }

        /// <summary>
        /// Chuyển đổi danh sách đối tượng OrderAddress sang danh sách OrderAddressItem.
        /// </summary>
        public static List<OrderAddressItem> ToItem(this List<OrderAddress> entity)
        {
            return OrdersMappingExtensions.ToItem(entity);
        }

        /// <summary>
        /// Chuyển đổi đối tượng OrderPackageModel sang OrderPackage.
        /// </summary>
        public static OrderPackage ToEntity(this OrderPackageModel entity)
        {
            return OrdersMappingExtensions.ToEntity(entity);
        }

        /// <summary>
        /// Chuyển đổi đối tượng OrderPackage sang OrderPackageModel.
        /// </summary>
        public static OrderPackageModel ToModel(this OrderPackage entity)
        {
            return OrdersMappingExtensions.ToModel(entity);
        }

        /// <summary>
        /// Chuyển đổi đối tượng OrderPackage sang OrderPackageItem.
        /// </summary>
        public static OrderPackageItem ToItem(this OrderPackage entity)
        {
            return OrdersMappingExtensions.ToItem(entity);
        }

        /// <summary>
        /// Chuyển đổi đối tượng OrderPackage sang OrderPackageResponseItem (với chuyển đổi đơn vị).
        /// </summary>
        public static OrderPackageResponseItem ToResponseItem(this OrderPackage entity)
        {
            return OrdersMappingExtensions.ToResponseItem(entity);
        }

        /// <summary>
        /// Chuyển đổi danh sách đối tượng OrderPackage sang danh sách OrderPackageItem.
        /// </summary>
        public static List<OrderPackageItem> ToItem(this List<OrderPackage> entity)
        {
            return OrdersMappingExtensions.ToItem(entity);
        }

        /// <summary>
        /// Chuyển đổi danh sách đối tượng OrderPackage sang danh sách OrderPackageResponseItem.
        /// </summary>
        public static List<OrderPackageResponseItem> ToResponseItem(this List<OrderPackage> entity)
        {
            return OrdersMappingExtensions.ToResponseItem(entity);
        }

        /// <summary>
        /// Chuyển đổi đối tượng OrderTrackModel sang OrderTrack.
        /// </summary>
        public static OrderTrack ToEntity(this OrderTrackModel entity)
        {
            return OrdersMappingExtensions.ToEntity(entity);
        }

        /// <summary>
        /// Chuyển đổi đối tượng OrderTrack sang OrderTrackItem.
        /// </summary>
        public static OrderTrackItem ToItem(this OrderTrack entity)
        {
            return OrdersMappingExtensions.ToItem(entity);
        }

        /// <summary>
        /// Chuyển đổi danh sách đối tượng OrderTrack sang danh sách OrderTrackItem.
        /// </summary>
        public static List<OrderTrackItem> ToItem(this List<OrderTrack> entity)
        {
            return OrdersMappingExtensions.ToItem(entity);
        }

        /// <summary>
        /// Chuyển đổi đối tượng OrderTimeTrackModel sang OrderTimeTrack.
        /// </summary>
        public static OrderTimeTrack ToEntity(this OrderTimeTrackModel entity)
        {
            return OrdersMappingExtensions.ToEntity(entity);
        }

        /// <summary>
        /// Chuyển đổi đối tượng OrderFinModel sang OrderFin.
        /// </summary>
        public static OrderFin ToEntity(this OrderFinModel entity)
        {
            return OrdersMappingExtensions.ToEntity(entity);
        }

        /// <summary>
        /// Chuyển đổi đối tượng OrderFin sang OrderFinItem.
        /// </summary>
        public static OrderFinItem ToItem(this OrderFin entity)
        {
            return OrdersMappingExtensions.ToItem(entity);
        }

        /// <summary>
        /// Chuyển đổi đối tượng OrderFin sang UpdateOrderFinModel.
        /// </summary>
        public static UpdateOrderFinModel ToUpdateModel(this OrderFin entity)
        {
            return OrdersMappingExtensions.ToUpdateModel(entity);
        }

        /// <summary>
        /// Chuyển đổi đối tượng OrderOpsModel sang OrderOps.
        /// </summary>
        public static OrderOps ToEntity(this OrderOpsModel entity)
        {
            return OrdersMappingExtensions.ToEntity(entity);
        }

        /// <summary>
        /// Chuyển đổi đối tượng OrderOps sang OrderOpsItem.
        /// </summary>
        public static OrderOpsItem ToItem(this OrderOps entity)
        {
            return OrdersMappingExtensions.ToItem(entity);
        }

        /// <summary>
        /// Chuyển đổi đối tượng OrderOps sang OpsOrderItem.
        /// </summary>
        public static OpsOrderItem ToOpsOrderItem(this OrderOps entity)
        {
            return OrdersMappingExtensions.ToOpsOrderItem(entity);
        }

        public static DriverOrderHistoryItem ToDriverOrderHistoryItem(this OrderOps entity)
        {
            return OrdersMappingExtensions.ToDriverOrderHistoryItem(entity);
        }
        #endregion

        // Đã tách Categories extensions sang CategoriesMappingProfile.cs

        #region Order
        /// <summary>
        /// Chuyển đổi đối tượng Order sang OrderModel.
        /// </summary>
        public static OrderModel ToModel(this Order entity)
        {
            return entity.MapTo<Order, OrderModel>();
        }

        /// <summary>
        /// Chuyển đổi đối tượng OrderModel sang Order.
        /// </summary>
        public static Order ToEntity(this OrderModel entity)
        {
            return entity.MapTo<OrderModel, Order>();
        }

        /// <summary>
        /// Chuyển đổi đối tượng Order sang OrderItem.
        /// </summary>
        public static OrderItem ToItem(this Order entity)
        {
            return entity.MapTo<Order, OrderItem>();
        }

        /// <summary>
        /// Chuyển đổi đối tượng Order sang OpsOrderItem.
        /// </summary>
        public static OpsOrderItem ToOpsItem(this Order entity)
        {
            return entity.MapTo<Order, OpsOrderItem>();
        }

        /// <summary>
        /// Chuyển đổi đối tượng Order sang OrderDetailModel.
        /// </summary>
        public static OrderDetailModel ToDetailModel(this Order entity)
        {
            return entity.MapTo<Order, OrderDetailModel>();
        }
        #endregion

        #region Identity
        // Đã tách Identity extensions sang IdentityMappingProfile.cs

        #endregion

        #region Price
        /// <summary>
        /// Chuyển đổi đối tượng Price sang PriceDetailModel.
        /// </summary>
        public static PriceDetailModel ToPriceDetailModel(this Price entity)
        {
            return entity.MapTo<Price, PriceDetailModel>();
        }
        #endregion

        #region Wallet
        /// <summary>
        /// Chuyển đổi đối tượng Price sang PriceDetailModel.
        /// </summary>
        public static WalletItem ToItem(this Wallet entity)
        {
            return entity.MapTo<Wallet, WalletItem>();
        }

        /// <summary>
        /// Chuyển đổi đối tượng Wallet sang WalletDetailModel.
        /// </summary>
        public static WalletDetailModel ToModel(this Wallet entity)
        {
            return entity.MapTo<Wallet, WalletDetailModel>();
        }

        public static TransactionItem ToItem(this Transaction entity)
        {
            return entity.MapTo<Transaction, TransactionItem>();
        }
        #endregion

        // Đã tách Orders Track, OrderFin, OrderOps extensions sang OrdersMappingProfile.cs

        #region Truck
        /// <summary>
        /// Chuyển đổi đối tượng TruckModel sang Truck.
        /// </summary>
        public static Truck ToEntity(this TruckModel entity)
        {
            return entity.MapTo<TruckModel, Truck>();
        }

        /// <summary>
        /// Chuyển đổi đối tượng Truck sang TruckModel.
        /// </summary>
        public static TruckModel ToModel(this Truck entity)
        {
            return entity.MapTo<Truck, TruckModel>();
        }

        /// <summary>
        /// Chuyển đổi đối tượng Truck sang TruckItem.
        /// </summary>
        public static TruckItem ToItem(this Truck entity)
        {
            return entity.MapTo<Truck, TruckItem>();
        }

        /// <summary>
        /// Chuyển đổi danh sách đối tượng Truck sang danh sách TruckItem.
        /// </summary>
        public static List<TruckItem> ToItem(this List<Truck> entity)
        {
            return entity.MapTo<List<Truck>, List<TruckItem>>();
        }
        #endregion

        #region Truck Activity
        /// <summary>
        /// Chuyển đổi đối tượng TruckActivityModel sang TruckActivity.
        /// </summary>
        public static TruckActivity ToEntity(this TruckActivityModel entity)
        {
            return entity.MapTo<TruckActivityModel, TruckActivity>();
        }

        /// <summary>
        /// Chuyển đổi đối tượng TruckActivity sang TruckActivityItem.
        /// </summary>
        public static TruckActivityItem ToItem(this TruckActivity entity)
        {
            return entity.MapTo<TruckActivity, TruckActivityItem>();
        }

        /// <summary>
        /// Chuyển đổi danh sách đối tượng TruckActivity sang danh sách TruckActivityItem.
        /// </summary>
        public static List<TruckActivityItem> ToItem(this List<TruckActivity> entity)
        {
            return entity.MapTo<List<TruckActivity>, List<TruckActivityItem>>();
        }
        #endregion

        #region Truck Asset

        /// <summary>
        /// Chuyển đổi đối tượng TruckAsset sang TruckAssetItem.
        /// </summary>
        public static TruckAssetItem ToItem(this TruckAsset entity)
        {
            return entity.MapTo<TruckAsset, TruckAssetItem>();
        }

        /// <summary>
        /// Chuyển đổi danh sách đối tượng TruckAsset sang danh sách TruckAssetItem.
        /// </summary>
        public static List<TruckAssetItem> ToItem(this List<TruckAsset> entity)
        {
            return entity.MapTo<List<TruckAsset>, List<TruckAssetItem>>();
        }

        /// <summary>
        /// Chuyển đổi đối tượng TruckAssetModel sang TruckAsset.
        /// </summary>
        public static TruckAsset ToEntity(this TruckAssetModel model)
        {
            return model.MapTo<TruckAssetModel, TruckAsset>();
        }
        #endregion

        #region Truck Specification Attribute
        /// <summary>
        /// Chuyển đổi đối tượng TruckSpecAttributeModel sang TruckSpecAttribute.
        /// </summary>
        public static TruckSpecAttribute ToEntity(this TruckSpecAttributeModel entity)
        {
            return entity.MapTo<TruckSpecAttributeModel, TruckSpecAttribute>();
        }

        /// <summary>
        /// Chuyển đổi đối tượng TruckSpecAttribute sang TruckSpecAttributeItem.
        /// </summary>
        public static TruckSpecAttributeItem ToItem(this TruckSpecAttribute entity)
        {
            return entity.MapTo<TruckSpecAttribute, TruckSpecAttributeItem>();
        }

        /// <summary>
        /// Chuyển đổi danh sách đối tượng TruckSpecAttribute sang danh sách TruckSpecAttributeItem.
        /// </summary>
        public static List<TruckSpecAttributeItem> ToItem(this List<TruckSpecAttribute> entity)
        {
            return entity.MapTo<List<TruckSpecAttribute>, List<TruckSpecAttributeItem>>();
        }
        #endregion

        #region Truck Maintenance Attribute
        /// <summary>
        /// Chuyển đổi đối tượng TruckMaintAttributeModel sang TruckMaintAttribute.
        /// </summary>
        public static TruckMaintAttribute ToEntity(this TruckMaintAttributeModel entity)
        {
            return entity.MapTo<TruckMaintAttributeModel, TruckMaintAttribute>();
        }

        /// <summary>
        /// Chuyển đổi đối tượng TruckMaintAttribute sang TruckMaintAttributeItem.
        /// </summary>
        public static TruckMaintAttributeItem ToItem(this TruckMaintAttribute entity)
        {
            return entity.MapTo<TruckMaintAttribute, TruckMaintAttributeItem>();
        }

        /// <summary>
        /// Chuyển đổi danh sách đối tượng TruckMaintAttribute sang danh sách TruckMaintAttributeItem.
        /// </summary>
        public static List<TruckMaintAttributeItem> ToItem(this List<TruckMaintAttribute> entity)
        {
            return entity.MapTo<List<TruckMaintAttribute>, List<TruckMaintAttributeItem>>();
        }
        #endregion

        #region Truck Maintenance Link
        /// <summary>
        /// Chuyển đổi đối tượng TruckMaintLinkModel sang TruckMaintLink.
        /// </summary>
        public static TruckMaintLink ToEntity(this TruckMaintLinkModel entity)
        {
            return entity.MapTo<TruckMaintLinkModel, TruckMaintLink>();
        }

        /// <summary>
        /// Chuyển đổi đối tượng TruckMaintLink sang TruckMaintLinkItem.
        /// </summary>
        public static TruckMaintLinkItem ToItem(this TruckMaintLink entity)
        {
            return entity.MapTo<TruckMaintLink, TruckMaintLinkItem>();
        }

        /// <summary>
        /// Chuyển đổi danh sách đối tượng TruckMaintLink sang danh sách TruckMaintLinkItem.
        /// </summary>
        public static List<TruckMaintLinkItem> ToItem(this List<TruckMaintLink> entity)
        {
            return entity.MapTo<List<TruckMaintLink>, List<TruckMaintLinkItem>>();
        }
        #endregion

        #region Truck Maintenance
        /// <summary>
        /// Chuyển đổi đối tượng TruckMaintenanceModel sang TruckMaintenance.
        /// </summary>
        public static TruckMaintenance ToEntity(this TruckMaintenanceModel entity)
        {
            return entity.MapTo<TruckMaintenanceModel, TruckMaintenance>();
        }

        /// <summary>
        /// Chuyển đổi đối tượng TruckMaintenance sang TruckMaintenanceItem.
        /// </summary>
        public static TruckMaintenanceItem ToItem(this TruckMaintenance entity)
        {
            return entity.MapTo<TruckMaintenance, TruckMaintenanceItem>();
        }

        /// <summary>
        /// Chuyển đổi danh sách đối tượng TruckMaintenance sang danh sách TruckMaintenanceItem.
        /// </summary>
        public static List<TruckMaintenanceItem> ToItem(this List<TruckMaintenance> entity)
        {
            return entity.MapTo<List<TruckMaintenance>, List<TruckMaintenanceItem>>();
        }
        #endregion

        #region Truck Specification 
        /// <summary>
        /// Chuyển đổi đối tượng TruckSpecificationModel sang TruckSpecification.
        /// </summary>
        public static TruckSpecification ToEntity(this TruckSpecificationModel entity)
        {
            return entity.MapTo<TruckSpecificationModel, TruckSpecification>();
        }

        /// <summary>
        /// Chuyển đổi đối tượng TruckSpecification sang TruckSpecificationItem.
        /// </summary>
        public static TruckSpecificationItem ToItem(this TruckSpecification entity)
        {
            return entity.MapTo<TruckSpecification, TruckSpecificationItem>();
        }

        /// <summary>
        /// Chuyển đổi danh sách đối tượng TruckSpecification sang danh sách TruckSpecificationItem.
        /// </summary>
        public static List<TruckSpecificationItem> ToItem(this List<TruckSpecification> entity)
        {
            return entity.MapTo<List<TruckSpecification>, List<TruckSpecificationItem>>();
        }
        #endregion

        #region CMS - Compatibility Extensions (delegating to CmsMappingProfile)
        // Category extensions
        public static CategoryModel ToModel(this Category entity)
            => CmsMappingExtensions.ToModel(entity);

        public static CategoryItem ToItem(this Category entity)
            => CmsMappingExtensions.ToItem(entity);

        public static CategoryTreeItem ToTreeItem(this Category entity)
            => CmsMappingExtensions.ToTreeItem(entity);

        public static Category ToEntity(this CategoryModel model)
            => CmsMappingExtensions.ToEntity(model);

        public static PostCategoryModel ToPostCategoryModel(this Category model)
            => CmsMappingExtensions.ToPostCategoryModel(model);

        // Tag extensions
        public static TagItem ToItem(this Tag entity)
            => CmsMappingExtensions.ToItem(entity);

        public static PostTagModel ToPostTagModel(this Tag model)
            => CmsMappingExtensions.ToPostTagModel(model);

        public static ProductTagModel ToProductTagModel(this Tag entity)
            => CmsMappingExtensions.ToProductTagModel(entity);

        public static Tag ToEntity(this PostTagModel model)
            => CmsMappingExtensions.ToEntity(model);

        public static Tag ToEntity(this ProductTagModel model)
            => CmsMappingExtensions.ToEntity(model);

        // UrlRecord extensions
        public static UrlRecordModel ToModel(this UrlRecord entity)
            => CmsMappingExtensions.ToModel(entity);

        public static UrlRecordItem ToItem(this UrlRecord entity)
            => CmsMappingExtensions.ToItem(entity);

        public static UrlRecord ToEntity(this UrlRecordModel model)
            => CmsMappingExtensions.ToEntity(model);

        // Post extensions
        public static PostItem ToItem(this Post entity)
            => CmsMappingExtensions.ToItem(entity);

        public static Post ToEntity(this PostModel model)
            => CmsMappingExtensions.ToEntity(model);

        public static PostModel ToModel(this Post model)
            => CmsMappingExtensions.ToModel(model);

        public static Post ToPost(this Post source, Post dest)
            => source.MapTo(dest);

        // Product extensions
        public static ProductItem ToItem(this Product entity)
            => CmsMappingExtensions.ToItem(entity);

        public static Product ToEntity(this ProductModel model)
            => CmsMappingExtensions.ToEntity(model);

        public static ProductModel ToModel(this Product model)
            => CmsMappingExtensions.ToModel(model);

        public static Product ToProduct(this Product source, Product dest)
            => source.MapTo(dest);

        // Topic extensions
        public static TopicItem ToItem(this Topic entity)
            => CmsMappingExtensions.ToItem(entity);

        public static Topic ToEntity(this TopicModel model)
            => CmsMappingExtensions.ToEntity(model);

        public static TopicModel ToModel(this Topic model)
            => CmsMappingExtensions.ToModel(model);

        public static Topic ToTopic(this Topic source, Topic dest)
            => source.MapTo(dest);
        #endregion

        #region DriverApp
        /// <summary>
        /// Chuyển đổi Order sang DriverFinOrderModel với logic tùy chỉnh cho userId
        /// </summary>
        public static DriverFinOrderModel ToDriverFinOrderModel(this Order entity, int userId)
        {
            return new DriverFinOrderModel
            {
                OrderId = entity.Id,
                OrderCode = entity.Code,
                SourceFee = entity.OrderFin?.SourceFeeCashierId == userId ? entity.OrderFin.SourceFee : 0,
                DestFee = entity.OrderFin?.DestFeeCashierId == userId ? entity.OrderFin.DestFee : 0,
                CollectAmount = entity.OrderFin?.CodCashierId == userId ? entity.OrderFin.CollectAmount : 0,
                CreatedDate = entity.CreatedTime?.DateTime ?? DateTime.MinValue,
                Note = entity.Note ?? string.Empty
            };
        }

        /// <summary>
        /// Chuyển đổi Order sang DriverFinOrderItem với logic tùy chỉnh cho userId (cho search có phân trang)
        /// </summary>
        public static DriverFinOrderItem ToDriverFinOrderItem(this Order entity, int userId)
        {
            var sourceAddress = entity.Addresses?.FirstOrDefault(a => a.AddressType == AddressType.Source);
            var destAddress = entity.Addresses?.FirstOrDefault(a => a.AddressType == AddressType.Dest);

            // Xác định loại tiền mà driver đang cầm
            var cashierTypes = new List<string>();
            if (entity.OrderFin?.SourceFeeCashierId == userId) cashierTypes.Add("SourceFee");
            if (entity.OrderFin?.DestFeeCashierId == userId) cashierTypes.Add("DestFee");
            if (entity.OrderFin?.CodCashierId == userId) cashierTypes.Add("COD");

            // Kiểm tra xem driver có phải là người thu tiền ban đầu không
            var isOriginalCashier = entity.OrderFin?.OriginalSourceFeeCashierId == userId ||
                                   entity.OrderFin?.OriginalDestFeeCashierId == userId ||
                                   entity.OrderFin?.OriginalCodCashierId == userId;

            // Lấy thời gian thu tiền sớm nhất
            DateTimeOffset? collectedTime = null;
            if (entity.OrderFin?.OriginalSourceFeeCashierId == userId && entity.OrderFin?.SourceFeeCollectedTime != null)
                collectedTime = entity.OrderFin.SourceFeeCollectedTime;
            if (entity.OrderFin?.OriginalDestFeeCashierId == userId && entity.OrderFin?.DestFeeCollectedTime != null)
                collectedTime = collectedTime == null || entity.OrderFin.DestFeeCollectedTime < collectedTime
                    ? entity.OrderFin.DestFeeCollectedTime : collectedTime;
            if (entity.OrderFin?.OriginalCodCashierId == userId && entity.OrderFin?.CodCollectedTime != null)
                collectedTime = collectedTime == null || entity.OrderFin.CodCollectedTime < collectedTime
                    ? entity.OrderFin.CodCollectedTime : collectedTime;

            // Xác định thông tin liên hệ theo loại phí thu
            string contactName = string.Empty;
            string contactPhone = string.Empty;
            string contactAddress = string.Empty;
            string addressType = string.Empty;

            // Ưu tiên hiển thị theo thứ tự: SourceFee -> DestFee -> COD
            if (entity.OrderFin?.SourceFeeCashierId == userId || entity.OrderFin?.OriginalSourceFeeCashierId == userId)
            {
                // Thu phí nguồn -> Hiển thị thông tin địa chỉ gửi hàng
                contactName = sourceAddress?.Name ?? string.Empty;
                contactPhone = sourceAddress?.PhoneNumber1 ?? string.Empty;
                contactAddress = $"{sourceAddress?.Address1 ?? ""} {sourceAddress?.Address2 ?? ""}".Trim();
                addressType = "Source";
            }
            else if (entity.OrderFin?.DestFeeCashierId == userId || entity.OrderFin?.OriginalDestFeeCashierId == userId ||
                     entity.OrderFin?.CodCashierId == userId || entity.OrderFin?.OriginalCodCashierId == userId)
            {
                // Thu phí đích hoặc COD -> Hiển thị thông tin địa chỉ giao hàng
                contactName = destAddress?.Name ?? string.Empty;
                contactPhone = destAddress?.PhoneNumber1 ?? string.Empty;
                contactAddress = $"{destAddress?.Address1 ?? ""} {destAddress?.Address2 ?? ""}".Trim();
                addressType = "Dest";
            }

            // Xác định trạng thái nộp tiền của lái xe
            var depositStatuses = new List<string>();

            // 1. Cước lấy hàng (SourceFee)
            if (entity.OrderFin?.OriginalSourceFeeCashierId == userId)
            {
                if (entity.OrderFin.SourceFeeCashierId == userId)
                    depositStatuses.Add("Cước lấy: Chưa nộp");
                else if (entity.OrderFin.SourceFeeCashierId != userId && (int)entity.OrderFin.SourceFeeStage > 2)
                    depositStatuses.Add("Cước lấy: Đã nộp");
            }

            // 2. Cước giao hàng (DestFee)
            if (entity.OrderFin?.OriginalDestFeeCashierId == userId)
            {
                if (entity.OrderFin.DestFeeCashierId == userId)
                    depositStatuses.Add("Cước giao: Chưa nộp");
                else if (entity.OrderFin.DestFeeCashierId != userId && (int)entity.OrderFin.DestFeeStage > 2)
                    depositStatuses.Add("Cước giao: Đã nộp");
            }

            // 3. Tiền thu hộ (COD)
            if (entity.OrderFin?.OriginalCodCashierId == userId)
            {
                if (entity.OrderFin.CodCashierId == userId)
                    depositStatuses.Add("COD: Chưa nộp");
                else if (entity.OrderFin.CodCashierId != userId && (int)entity.OrderFin.CodStage > 2)
                    depositStatuses.Add("COD: Đã nộp");
            }

            var depositStatus = depositStatuses.Any() ? string.Join(", ", depositStatuses) : string.Empty;

            return new DriverFinOrderItem
            {
                Id = entity.Id,
                OrderId = entity.Id,
                OrderCode = entity.Code ?? string.Empty,
                PartnerCode = entity.PartnerCode ?? string.Empty,
                SourceFee = entity.OrderFin?.SourceFeeCashierId == userId ? entity.OrderFin.SourceFee : 0,
                DestFee = entity.OrderFin?.DestFeeCashierId == userId ? entity.OrderFin.DestFee : 0,
                CollectAmount = entity.OrderFin?.CodCashierId == userId ? entity.OrderFin.CollectAmount : 0,
                Status = entity.OrderOps?.Status ?? OrderStatus.Unknown,
                PhysicalStatus = entity.OrderOps?.PhysicalStatus ?? OrderPhysicalStatus.WaitToPickup,
                PayFeeType = entity.OrderFin?.PayFeeType ?? OrderFinEnum.PayFeeType.SenderPay,
                CreatedDate = entity.CreatedTime?.DateTime ?? DateTime.MinValue,
                Note = entity.Note ?? string.Empty,
                CustomerName = entity.Customer?.FullName ?? string.Empty,
                PicUserName = entity.OrderOps?.PicUserName ?? string.Empty,
                RouteName = string.Empty, // Route info not available in current structure
                SourceAddress = $"{sourceAddress?.Address1 ?? ""} {sourceAddress?.Address2 ?? ""}".Trim(),
                DestAddress = $"{destAddress?.Address1 ?? ""} {destAddress?.Address2 ?? ""}".Trim(),
                SourceWardId = sourceAddress?.WardId ?? 0,
                DestWardId = destAddress?.WardId ?? 0,
                CashierType = string.Join(", ", cashierTypes),
                IsOriginalCashier = isOriginalCashier,
                CollectedTime = collectedTime,
                ContactName = contactName,
                ContactPhone = contactPhone,
                ContactAddress = contactAddress,
                AddressType = addressType,
                DepositStatus = depositStatus,
                CreatedBy = entity.CreatedBy,
                CreatedByUserName = entity.CreatedByUserName ?? string.Empty,
                CreatedTime = entity.CreatedTime,
                UpdatedBy = entity.UpdatedBy,
                UpdatedByUserName = entity.UpdatedByUserName ?? string.Empty,
                UpdatedTime = entity.UpdatedTime
            };
        }
        #endregion

        #region HR - Compatibility Extensions (delegating to HrMappingProfile)
        // JobPost extensions
        public static JobPostModel ToModel(this JobPost entity)
            => HrMappingExtensions.ToModel(entity);

        public static JobPostItem ToItem(this JobPost entity)
            => HrMappingExtensions.ToItem(entity);

        public static JobPost ToEntity(this JobPostModel model)
            => HrMappingExtensions.ToEntity(model);

        // Candidate extensions
        public static CandidateModel ToModel(this Candidate entity)
            => HrMappingExtensions.ToModel(entity);

        public static CandidateReviewModel ToReviewModel(this Candidate entity)
            => HrMappingExtensions.ToReviewModel(entity);

        public static CandidateItem ToItem(this Candidate entity)
            => HrMappingExtensions.ToItem(entity);

        public static Candidate ToEntity(this CandidateModel model)
            => HrMappingExtensions.ToEntity(model);

        // Attendance extensions
        public static AttendanceItem ToItem(this Attendance entity)
            => HrMappingExtensions.ToItem(entity);

        public static async Task<AttendanceItem> ToItemWithMedia(this Attendance entity, IUnifiedMediaService unifiedMediaService)
            => await HrMappingExtensions.ToItemWithMedia(entity, unifiedMediaService);
        #endregion

        #region ScriptConfig
        public static ScriptConfigModel ToModel(this ScriptConfig entity)
        {
            return entity.MapTo<ScriptConfig, ScriptConfigModel>();
        }
        public static ScriptConfigItem ToItem(this ScriptConfig entity)
        {
            return entity.MapTo<ScriptConfig, ScriptConfigItem>();
        }
        public static ScriptConfig ToEntity(this ScriptConfigModel model)
        {
            return model.MapTo<ScriptConfigModel, ScriptConfig>();
        }
        #endregion


        #region CallPath
        public static CallPathModel ToModel(this CallPath entity)
        {
            return CallPathMappingExtensions.ToModel(entity);
        }
        public static CallPathItem ToItem(this CallPath entity)
        {
            return CallPathMappingExtensions.ToItem(entity);
        }
        public static CallPath ToEntity(this CallPathModel model)
        {
            return CallPathMappingExtensions.ToEntity(model);
        }
        #endregion

        #region FuelCards Extensions

        public static FuelRefillItem ToItem(this FuelRefill entity)
        {
            return new FuelRefillItem
            {
                Id = entity.Id,
                TruckActivityId = 0, // Not used anymore
                TruckId = entity.TruckId,
                TruckLicensePlate = entity.Truck?.LicensePlate ?? string.Empty,
                DriverId = entity.DriverId,
                DriverName = entity.Driver?.UserName ?? string.Empty,
                DriverFullName = entity.Driver?.FullName ?? string.Empty,
                FuelCardId = entity.FuelCardId,
                FuelCardNumber = entity.FuelCard?.CardNumber,
                PreviousOdo = entity.PreviousOdo,
                CurrentOdo = entity.CurrentOdo,
                DistanceKm = entity.DistanceKm,
                Amount = entity.Amount,
                UnitPrice = entity.UnitPrice,
                ActualLiters = entity.ActualLiters,
                FuelQuotaPer100Km = entity.FuelQuotaPer100Km,
                QuotaLiters = entity.QuotaLiters,
                DifferenceLiters = entity.DifferenceLiters,
                PaymentMethod = entity.PaymentMethod,
                StationName = entity.StationName,
                StationAddress = entity.StationAddress,
                RefillTime = entity.RefillTime,
                FuelCardTransactionId = entity.FuelCardTransactionId,
                Notes = entity.Notes,
                CreatedTime = entity.CreatedTime,
                MediaItems = entity.FuelRefillMedias?.Select(m => new TruckActivityMediaItem
                {
                    Id = m.Id,
                    MediaId = m.MediaId,
                    MediaUrl = m.Media?.SystemPath ?? string.Empty,
                    MediaType = m.MediaType,
                    DisplayOrder = m.DisplayOrder
                }).ToList() ?? new List<TruckActivityMediaItem>()
            };
        }

        #endregion


        #region RewardPenaltyTicket Extensions

        public static RewardPenaltyTicketItem ToItem(this RewardPenaltyTicket entity)
        {
            return entity.MapTo<RewardPenaltyTicket, RewardPenaltyTicketItem>();
        }

        public static RewardPenaltyTicket ToEntity(this RewardPenaltyTicketItem item)
        {
            return item.MapTo<RewardPenaltyTicketItem, RewardPenaltyTicket>();
        }

        public static RewardPenaltyTicketModel ToModel(this RewardPenaltyTicket entity)
        {
            return entity.MapTo<RewardPenaltyTicket, RewardPenaltyTicketModel>();
        }

        public static RewardPenaltyTicket ToEntity(this RewardPenaltyTicketModel model)
        {
            return model.MapTo<RewardPenaltyTicketModel, RewardPenaltyTicket>();
        }

        #endregion

        // Đã tách các extension cho Expense, ExpenseHistory sang FinanceMappingExtensions.cs
    }
}


