using SharedLibraryCore.Database;
using SharedLibraryCore.Database.Models;
using SharedLibraryCore.Events;
using SharedLibraryCore.Interfaces;
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;

namespace SharedLibraryCore.Services
{
    public class ChangeHistoryService : IEntityService<EFChangeHistory>
    {
        public Task<EFChangeHistory> Create(EFChangeHistory entity)
        {
            throw new NotImplementedException();
        }

        public async Task<EFChangeHistory> Add(GameEvent e)
        {
            EFChangeHistory change = null;

            switch (e.Type)
            {
                case GameEvent.EventType.Ban:
                    change = new EFChangeHistory()
                    {
                        OriginEntityId = e.Origin.ClientId,
                        TargetEntityId = e.Target.ClientId,
                        TypeOfChange = EFChangeHistory.ChangeType.Ban,
                        Comment = e.Data
                    };
                    break;
                case GameEvent.EventType.Command:
                    break;
                case GameEvent.EventType.ChangePermission:
                    change = new EFChangeHistory()
                    {
                        OriginEntityId = e.Origin.ClientId,
                        TargetEntityId = e.Target.ClientId,
                        TypeOfChange = EFChangeHistory.ChangeType.Permission,
                        PreviousValue = ((Change)e.Extra).PreviousValue,
                        CurrentValue = ((Change)e.Extra).NewValue
                    };
                    break;
                default:
                    break;
            }

            if (change != null)
            {
                using (var ctx = new DatabaseContext(true))
                {
                    ctx.EFChangeHistory.Add(change);
                    try
                    {
                        await ctx.SaveChangesAsync();
                    }

                    catch (Exception ex)
                    {
                        e.Owner.Logger.WriteDebug(ex.GetExceptionInfo());
                    }
                }
            }

            return change;
        }

        public Task<EFChangeHistory> Delete(EFChangeHistory entity)
        {
            throw new NotImplementedException();
        }

        public Task<IList<EFChangeHistory>> Find(Func<EFChangeHistory, bool> expression)
        {
            throw new NotImplementedException();
        }

        public Task<EFChangeHistory> Get(int entityID)
        {
            throw new NotImplementedException();
        }

        public Task<EFChangeHistory> GetUnique(long entityProperty)
        {
            throw new NotImplementedException();
        }

        public Task<EFChangeHistory> Update(EFChangeHistory entity)
        {
            throw new NotImplementedException();
        }
    }
}