using Hangfire.Storage.Monitoring;
using Lada.Framework.Data.Domains;
using Lada.Framework.Data.Domains.Hr;
using Lada.Framework.Data.Domains.Orders;
using Lada.Framework.Data.Repositories;
using Lada.Framework.DTO;
using Ladaer.BackEnd.Infrastructures.DTO;
using Ladaer.BackEnd.Infrastructures.DTO.Models.Orders;
using Ladaer.BackEnd.Infrastructures.DTO.Results.Orders;

namespace Ladaer.BackEnd.Infrastructures.Services.Orders
{
    /// <summary>
    /// Giao diện cho dịch vụ quản lý hành trình đơn hàng.
    /// </summary>
    public interface IOrderTrackService
    {
        /// <summary>
        /// Tạo mới hành trình đơn hàng.
        /// </summary>
        /// <param name="model">Thông tin hành trình đơn hàng.</param>
        /// <returns>Kết quả của thao tác.</returns>
        Task<OrderTrackResult> CreateAsync(OrderTrackModel model);

        /// <summary>
        /// Tạo mới danh sách hành trình đơn hàng.
        /// </summary>
        /// <param name="models">Danh sách thông tin hành trình đơn hàng.</param>
        /// <returns>Kết quả của thao tác.</returns>
        Task<BaseResult> CreateAsync(List<OrderTrackModel> models);
    }
    /// <summary>
    /// Triển khai dịch vụ quản lý hành trình đơn hàng.
    /// </summary>
    public class OrderTrackService : IOrderTrackService
    {
        private readonly IRepository<OrderTrack> _orderTrackRepository;

        /// <summary>
        /// Khởi tạo một thể hiện của <see cref="OrderTrackService"/>.
        /// </summary>
        /// <param name="orderTrackRepository">Đối tượng IRepository của OrderTrack.</param>
        public OrderTrackService(IRepository<OrderTrack> orderTrackRepository)
        {
            _orderTrackRepository = orderTrackRepository;
        }

        /// <summary>
        /// Tạo mới hành trình đơn hàng.
        /// </summary>
        /// <param name="model">Thông tin hành trình đơn hàng.</param>
        /// <returns>Kết quả của thao tác.</returns>
        public async Task<OrderTrackResult> CreateAsync(OrderTrackModel model)
        {
            var result = new OrderTrackResult();
            var orderTrack = model.ToEntity();

            orderTrack = orderTrack.UpdateCommonGuid(model.UpdatedBy, model.UpdatedByUserName);

            try
            {
                await _orderTrackRepository.InsertAsync(orderTrack);
                result.Id = orderTrack.Id;
            }
            catch (Exception ex)
            {
                result.Result = Result.SystemError;
                result.Message = ex.ToString();
                result.Id = Guid.Empty;
            }
            return result;
        }

        /// <summary>
        /// Tạo mới danh sách hành trình đơn hàng.
        /// </summary>
        /// <param name="models">Danh sách thông tin hành trình đơn hàng.</param>
        /// <returns>Kết quả của thao tác.</returns>
        public async Task<BaseResult> CreateAsync(List<OrderTrackModel> models)
        {
            var result = new OrderTrackResult();

            var orderTracks = new List<OrderTrack>();

            foreach (var model in models)
            {
                var orderTrack = model.ToEntity();
                orderTracks.Add(orderTrack.UpdateCommonGuid(model.UpdatedBy, model.UpdatedByUserName));
            }

            try
            {
                await _orderTrackRepository.InsertAsync(orderTracks);
            }
            catch (Exception ex)
            {
                result.Result = Result.SystemError;
                result.Message = ex.ToString();
            }
            return result;
        }
    }
}
