using AutoMapper;
using Microsoft.EntityFrameworkCore;
using SessionCompanion.Database.Repositories.Base;
using SessionCompanion.Database.Tables;
using SessionCompanion.Extensions.EitherType;
using SessionCompanion.Services.Base;
using SessionCompanion.Services.Interfaces;
using SessionCompanion.ViewModels.ApiResponses;
using SessionCompanion.ViewModels.ShopkeeperViewModels;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SessionCompanion.Services.Services
{
    public class ShopkeeperService : ServiceBase<ShopkeeperViewModel, Shopkeeper>, IShopkeeperService
    {
        public ShopkeeperService(IMapper mapper, IRepository<Shopkeeper> repository) : base(mapper, repository)
        { }
        /// <summary>
        /// Funkcja zmienia status sprzedawcy
        /// </summary>
        /// <param name="shopkeeperId"></param>
        /// <param name="availability"></param>
        /// <returns>SuccesResponse/ErrorResponse</returns>
        public async Task<Either<SuccessResponse, ErrorResponse>> ChangeShopkeeperStatus(int shopkeeperId, bool availability)
        {
            try
            {
                var shopkeepers = await Repository.Get().ToListAsync();
                if (availability)
                {
                    foreach (var shopkeeper in shopkeepers)
                    {
                        if (shopkeeper.Id.Equals(shopkeeperId))
                            shopkeeper.IsAvailable = true;
                        else
                            shopkeeper.IsAvailable = false;
                        await Repository.Update(shopkeeper);
                    }
                    await Repository.Save();
                    return new SuccessResponse("Shopkeepers updated") { SuccessCode = 200 };
                }

                var newActiveShopkeeper = shopkeepers.Where(c => c.Id.Equals(shopkeeperId)).Single();
                newActiveShopkeeper.IsAvailable = false;
                await Repository.Update(newActiveShopkeeper);
                await Repository.Save();
                return new SuccessResponse("Shopkeepers updated") { SuccessCode = 200 };
            }
            catch (Exception e)
            {
                return new ErrorResponse() { StatusCode = 500, Message = e.Message };
            }
        }
    }
}