using MediatR;
using Microsoft.EntityFrameworkCore;
using Sledgemapper.Api.Commands;
using Sledgemapper.Api.Infrastructure.Data;
using Sledgemapper.Shared.Entities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;

namespace Sledgemapper.Api.Handlers
{
    public class GetCampaignsCommandHandler : IRequestHandler<GetCampaignsCommand, List<Campaign>>
    {
        private readonly IMediator _mediator;
        private readonly SledgemapperDbContext _dbcontext;

        public GetCampaignsCommandHandler(IMediator mediator, SledgemapperDbContext dbcontext)
        {
            _mediator = mediator;
            _dbcontext = dbcontext;
        }

        public async Task<List<Campaign>> Handle(GetCampaignsCommand command, CancellationToken cancellationToken)
        {
            try
            {
                var user = await _dbcontext.Users.FindAsync(command.UserId);
                _dbcontext.Attach(user);
                var campaigns = _dbcontext.Campaigns.Include(c => c.InvitedUsers).Include(c => c.Maps).Include(c => c.Owner).Where(campaign => campaign.OwnerId == command.UserId || campaign.InvitedUsers.Contains(user));

                return campaigns.
                    Select(c => new Shared.Entities.Campaign { Id = c.CampaignId, Name = c.CampaignName, Maps = c.Maps.Select(m => new Shared.Entities.Map { SessionName = m.SessionName }).ToList() })
                    .ToList();
            }
            catch (Exception ex)
            {
            }
            return new List<Campaign>();
        }
    }
}