﻿using AsmodeeDigital.Common.Plugin.Domain.CrossPromo;
using AsmodeeDigital.Common.Plugin.Manager.Event;
using AsmodeeDigital.Common.Plugin.Network;
using AsmodeeDigital.CrossPromo.Plugin.View;
using System;

namespace AsmodeeDigital.CrossPromo.Plugin.Logic
{
    public class CrossPromoLogic : IDisposable
    {
        #region Events
        public event Action<Product> ReceivingProductEvent;

        public event Action<GroupProduct> ReceivingGroupProductEvent;
        #endregion

        private RestAPI _restAPI;

        private AuthenticationTokens _authenticationTokens;

        public CrossPromoLogic(RestAPI restAPI)
        {
            _restAPI = restAPI;
        }

        public void Init()
        {
            _restAPI.ConnectionSuccessEvent += RestAPI_ConnectionSuccessEvent;
            _restAPI.ReceivingProductEvent += RestAPI_ReceivingProductEvent;
            _restAPI.ReceivingGroupProductEvent += RestAPI_ReceivingGroupProductEvent;

            _restAPI.Connect();
        }

        #region Plubic method accessed by the view
        public void SetAuthenticationToken(AuthenticationTokens authenticationTokens)
        {
            _authenticationTokens = authenticationTokens;
        }

        public void BannerRequest()
        {
            _restAPI.BannerRequest(_authenticationTokens.access_token);
        }

        public void MoreGameRequest(MoreGamesFilters moreGamefilters)
        {
            _restAPI.MoreGameRequest(_authenticationTokens.access_token, moreGamefilters, CrossPromoView.Instance.NbColumns);
        }

        public void InterstitialRequest()
        {
            _restAPI.InterstitialRequest(_authenticationTokens.access_token, 3);
        }
        #endregion

        #region REST API events
        private void RestAPI_ConnectionSuccessEvent(AuthenticationTokens authenticationTokens)
        {
            _authenticationTokens = authenticationTokens;
        }

        private void RestAPI_ReceivingProductEvent(Product product)
        {
            if (ReceivingProductEvent != null)
                ReceivingProductEvent(product);
        }

        private void RestAPI_ReceivingGroupProductEvent(GroupProduct groupProduct)
        {
            if (ReceivingGroupProductEvent != null)
                ReceivingGroupProductEvent(groupProduct);
        }
        #endregion

        public void Dispose()
        {
            _restAPI.ConnectionSuccessEvent -= RestAPI_ConnectionSuccessEvent;
            _restAPI.ReceivingProductEvent -= RestAPI_ReceivingProductEvent;
            _restAPI.ReceivingGroupProductEvent -= RestAPI_ReceivingGroupProductEvent;
        }
    }
}
