using AsbCloudApp.Data;
using AsbCloudApp.Services;
using AsbCloudDb.Model;
using Mapster;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;

namespace AsbCloudInfrastructure.Repository
{
    public class DrillFlowChartRepository : CrudWellRelatedServiceBase<DrillFlowChartDto, DrillFlowChart>,
        IDrillFlowChartRepository
    {
        private readonly IWellService wellService;

        public DrillFlowChartRepository(IAsbCloudDbContext context, IWellService wellService)
            : base(context)
        {
            this.wellService = wellService;
        }

        public async Task<IEnumerable<DrillFlowChartDto>> GetAllAsync(int idWell,
            DateTime updateFrom, CancellationToken token = default)
        {
            var timezone = wellService.GetTimezone(idWell);
            var updateFromUtc = updateFrom.ToUtcDateTimeOffset(timezone.Hours);
            var entities = await GetQuery()
                            .Where(e => e.IdWell == idWell)
                            .Where(e => e.LastUpdate == updateFromUtc)
                            .OrderBy(e => e.DepthStart)
                            .ThenBy(e => e.Id)
                            .ToListAsync(token)
                            .ConfigureAwait(false);

            var dtos = entities.Select(entity =>
            {
                var dto = entity.Adapt<DrillFlowChartDto>();
                dto.LastUpdate = entity.LastUpdate.ToRemoteDateTime(timezone.Hours);
                return dto;
            });
            return dtos;
        }

        public override async Task<int> InsertAsync(DrillFlowChartDto dto,
            CancellationToken token = default)
        {
            dto.LastUpdate = DateTime.UtcNow;
            var result = await base.InsertAsync(dto, token);
            return result;
        }

        public override async Task<int> UpdateAsync(DrillFlowChartDto dto,
            CancellationToken token = default)
        {
            dto.LastUpdate = DateTime.UtcNow;
            var result = await base.UpdateAsync(dto, token);
            return result;
        }
    }
}