using skydiveLogs_api.Domain;
using skydiveLogs_api.DomainBusiness.Interfaces;
using skydiveLogs_api.DomainService.Repositories;
using System;
using System.Collections.Generic;
using System.Linq;

namespace skydiveLogs_api.DomainBusiness
{
    public class TunnelFlightService : ITunnelFlightService
    {
        #region Public Constructors

        public TunnelFlightService(IJumpTypeService jumpTypeService, 
                                   ITunnelFlightRepository tunnelFlightRepository,
                                   IDropZoneService dropZoneService,
                                   IIdentityService identityService)
        {
            _dropZoneService = dropZoneService;
            _jumpTypeService = jumpTypeService;
            _identityService = identityService;
            _tunnelFlightRepository = tunnelFlightRepository;
        }

        #endregion Public Constructors

        #region Public Methods

        public IEnumerable<TunnelFlight> GetAllTunnelFlights()
        {
            return _tunnelFlightRepository.GetAll(_identityService.ConnectedUser);
        }

        public TunnelFlight GetTunnelFlightById(int id)
        {
            return _tunnelFlightRepository.GetById(id);
        }

        public int GetTunnelFlightCount()
        {
            return _tunnelFlightRepository.GetCount(_identityService.ConnectedUser);
        }

        public IEnumerable<TunnelFlight> GetTunnelFlightsByIndexes(int beginIndex, int endIndex)
        {
            return _tunnelFlightRepository.GetBetweenIndex(_identityService.ConnectedUser, beginIndex, endIndex);
        }

        public IEnumerable<Statistic> GetTunnelFlightGroupByMonth(string beginDate, string endDate)
        {
            var convertedBeginDate = Convert.ToDateTime(beginDate);
            var convertedEndDate = Convert.ToDateTime(endDate);

            var allTunnelFlights = _tunnelFlightRepository.GetBetweenDate(_identityService.ConnectedUser, convertedBeginDate, convertedEndDate);
            var results = Enumerable.Empty<Statistic>();

            if (allTunnelFlights.Any())
            {
                results = allTunnelFlights.GroupBy(j => new { FlightDate = j.FlightDate.ToString("yy-MM"), j.JumpType },
                                                   j => j,
                                                   (groupby, tunnelFlights) => new Statistic
                                                   {
                                                       Label = groupby.FlightDate,
                                                       Label2 = groupby.JumpType.Name,
                                                       Nb = tunnelFlights.Sum(t => t.NbMinutes)
                                                   })
                                           .ToList();
            }

            return results;
        }
        public IEnumerable<TunnelFlight> GetTunnelFlightByDates(string beginDate, string endDate)
        {
            var convertedBeginDate = Convert.ToDateTime(beginDate);
            var convertedEndDate = Convert.ToDateTime(endDate);

            return _tunnelFlightRepository.GetBetweenDate(_identityService.ConnectedUser, convertedBeginDate, convertedEndDate);
        }
                               
        public void AddNewFlight(int tunnelId, int jumpTypeId, TunnelFlight newFlight)
        {
            var tmp = _dropZoneService.GetDzById(tunnelId);
            var selectedTunnel = new Tunnel
            {
                Id = tmp.Id,
                Name = tmp.Name,
                Website = tmp.Website,
                Address = tmp.Address,
                Email = tmp.Email,
                Latitude = tmp.Latitude,
                Longitude = tmp.Longitude
            };

            var selectedJumpType = _jumpTypeService.GetJumpTypeById(jumpTypeId);


            newFlight.Tunnel = selectedTunnel;
            newFlight.JumpType = selectedJumpType;
            _tunnelFlightRepository.Add(newFlight);
        }

        public void DeleteTunnelFlightById(int id)
        {
            _tunnelFlightRepository.DeleteById(id);
        }

        public void UpdateTunnelFlight(int id, TunnelFlight updatedTunnelFlight)
        {
            var myTunnelFlight = GetTunnelFlightById(id);
            myTunnelFlight.FlightDate = updatedTunnelFlight.FlightDate;
            myTunnelFlight.NbMinutes = updatedTunnelFlight.NbMinutes;
            myTunnelFlight.Notes = updatedTunnelFlight.Notes;

            _tunnelFlightRepository.Update(myTunnelFlight);
        }

        #endregion Public Methods

        #region Private Fields

        private readonly IDropZoneService _dropZoneService;
        private readonly IJumpTypeService _jumpTypeService;
        private readonly ITunnelFlightRepository _tunnelFlightRepository;
        private readonly IIdentityService _identityService;

        #endregion Private Fields
    }
}