using Lada.Framework.Data.Domains;
using Lada.Framework.Data.Domains.Trucks;
using Lada.Framework.Data.Repositories;
using Lada.Framework.DTO;
using Ladaer.BackEnd.Infrastructures.DTO;
using Ladaer.BackEnd.Infrastructures.DTO.Models;
using Ladaer.BackEnd.Infrastructures.DTO.Models.Trucks;
using Ladaer.BackEnd.Infrastructures.DTO.Results.Trucks;
using Microsoft.EntityFrameworkCore;

namespace Ladaer.BackEnd.Infrastructures.Services.Trucks
{
    /// <summary>
    /// Giao diện cho dịch vụ quản lý tài sản xe tải.
    /// </summary>
    public interface ITruckAssetService
    {
        /// <summary>
        /// Lấy thông tin tài sản xe tải theo danh sách ID.
        /// </summary>
        /// <param name="param">Danh sách ID của tài sản xe tải.</param>
        /// <returns>Kết quả chứa thông tin tài sản xe tải.</returns>
        Task<TruckAssetResult> GetByIds(KeyModels<int> param);

        /// <summary>
        /// Tạo mới hoặc cập nhật thông tin tài sản xe tải.
        /// </summary>
        /// <param name="param">Thông tin tài sản xe tải.</param>
        /// <returns>Kết quả của thao tác.</returns>
        Task<BaseResult> CreateOrUpdate(TruckAssetModel param);

        /// <summary>
        /// Xóa thông tin tài sản xe tải.
        /// </summary>
        /// <param name="param">Thông tin tài sản xe tải.</param>
        /// <returns>Kết quả của thao tác.</returns>
        Task<BaseResult> Delete(TruckModel param);
    }
    /// <summary>
    /// Triển khai dịch vụ quản lý tài sản xe tải.
    /// </summary>
    public class TruckAssetService : ITruckAssetService
    {
        private readonly IRepository<Truck> _truckRepository;
        private readonly IRepository<TruckActivity> _truckActivityRepository;
        private readonly IRepository<TruckAsset> _truckAssetRepository;
        private readonly IRepository<TruckSpecAttribute> _truckSpecAttributeRepository;
        private readonly IRepository<TruckMaintAttribute> _truckMaintAttributeRepository;
        private readonly IRepository<TruckMaintenance> _truckMaintenanceRepository;
        private readonly IRepository<TruckSpecification> _truckSpecificationRepository;

        /// <summary>
        /// Khởi tạo một thể hiện của <see cref="TruckAssetService"/>.
        /// </summary>
        /// <param name="truckRepository">Đối tượng IRepository của Truck.</param>
        /// <param name="truckActivityRepository">Đối tượng IRepository của TruckActivity.</param>
        /// <param name="truckAssetRepository">Đối tượng IRepository của TruckAsset.</param>
        /// <param name="truckSpecAttributeRepository">Đối tượng IRepository của TruckSpecAttribute.</param>
        /// <param name="truckMaintAttributeRepository">Đối tượng IRepository của TruckMaintAttribute.</param>
        /// <param name="truckMaintenanceRepository">Đối tượng IRepository của TruckMaintenance.</param>
        /// <param name="truckSpecificationRepository">Đối tượng IRepository của TruckSpecification.</param>
        public TruckAssetService(IRepository<Truck> truckRepository,
            IRepository<TruckActivity> truckActivityRepository,
            IRepository<TruckAsset> truckAssetRepository,
            IRepository<TruckSpecAttribute> truckSpecAttributeRepository,
            IRepository<TruckMaintAttribute> truckMaintAttributeRepository,
            IRepository<TruckMaintenance> truckMaintenanceRepository,
            IRepository<TruckSpecification> truckSpecificationRepository)
        {
            _truckRepository = truckRepository;
            _truckActivityRepository = truckActivityRepository;
            _truckAssetRepository = truckAssetRepository;
            _truckSpecAttributeRepository = truckSpecAttributeRepository;
            _truckMaintAttributeRepository = truckMaintAttributeRepository;
            _truckMaintenanceRepository = truckMaintenanceRepository;
            _truckSpecificationRepository = truckSpecificationRepository;
        }

        #region TruckAsset
        /// <summary>
        /// Lấy thông tin tài sản xe tải theo danh sách ID.
        /// </summary>
        /// <param name="param">Danh sách ID của tài sản xe tải.</param>
        /// <returns>Kết quả chứa thông tin tài sản xe tải.</returns>
        public async Task<TruckAssetResult> GetByIds(KeyModels<int> param)
        {
            TruckAssetResult result = new TruckAssetResult { Result = Result.Success };
            if (param.Ids.Any())
            {
                var entities = await _truckAssetRepository.Query().Where(x => param.Ids.Contains(x.Id)).ToListAsync();
                if (entities != null && entities.Any())
                {
                    result.Items = entities.ToItem();
                    result.Result = Result.Success;
                }
                else
                {
                    result.Result = Result.Failed;
                    result.Message = "Không tìm thấy tài sản xe tải nào";
                }
            }
            else
            {
                result.Result = Result.Failed;
                result.Message = "Không tìm thấy tài sản xe tải nào";
            }
            return result;
        }

        /// <summary>
        /// Tạo mới hoặc cập nhật thông tin tài sản xe tải.
        /// </summary>
        /// <param name="param">Thông tin tài sản xe tải.</param>
        /// <returns>Kết quả của thao tác.</returns>
        public async Task<BaseResult> CreateOrUpdate(TruckAssetModel param)
        {
            BaseResult result = new BaseResult { Result = Result.Success };
            if (param.Id > 0)
            {
                if (param.TruckId > 0)
                {
                    var entity = await _truckAssetRepository.GetByIdAsync(param.Id);
                    if (entity != null)
                    {
                        entity.LifeCycle = param.LifeCycle;
                        entity.UnitPrice = param.UnitPrice;
                        entity.Quantity = param.Quantity;
                        entity.Name = param.Name;
                        entity = entity.UpdateCommonInt(param.UpdatedBy, param.UpdatedByUserName);

                        var rs = await _truckAssetRepository.UpdateAsync(entity);
                        if (rs > 0)
                        {
                            result.Result = Result.Success;
                        }
                    }
                    else
                    {
                        result.Result = Result.Failed;
                        result.Message = "Không tìm thấy tài sản xe tải nào";
                    }
                }
                else
                {
                    result.Result = Result.Failed;
                    result.Message = "Không tìm thấy xe tải nào";
                }
            }
            else
            {
                if (param.TruckId > 0)
                {
                    var entity = param.ToEntity();
                    entity = entity.UpdateCommonInt(param.UpdatedBy, param.UpdatedByUserName);

                    try
                    {
                        var rs = await _truckAssetRepository.InsertAsync(entity);
                        if (rs > 0)
                        {
                            result.Result = Result.Success;
                        }
                    }
                    catch (Exception e)
                    {
                        result.Result = Result.SystemError;
                        result.Message = e.Message;
                    }
                }
                else
                {
                    result.Result = Result.Failed;
                    result.Message = "Không tìm thấy xe tải nào";
                }
            }
            return result;
        }

        /// <summary>
        /// Xóa thông tin tài sản xe tải.
        /// </summary>
        /// <param name="param">Thông tin tài sản xe tải.</param>
        /// <returns>Kết quả của thao tác.</returns>
        public async Task<BaseResult> Delete(TruckModel param)
        {
            BaseResult result = new BaseResult { Result = Result.Success };
            if (param.Id > 0)
            {
                var entity = await _truckAssetRepository.GetByIdAsync(param.Id);
                if (entity != null)
                {
                    var rs = await _truckAssetRepository.DeleteAsync(entity);
                    if (rs > 0)
                    {
                        result.Result = Result.Success;
                    }
                }
                else
                {
                    result.Result = Result.Failed;
                    result.Message = "Không tìm thấy tài sản xe tải nào";
                }
            }
            else
            {
                result.Result = Result.Failed;
                result.Message = "Không tìm thấy tài sản xe tải nào";
            }
            return result;
        }
        #endregion
    }
}
