using System;
using Bit.App.Abstractions;
using Android.Gms.Analytics;
using Android.Content;

namespace Bit.Android.Services
{
    public class GoogleAnalyticsService : IGoogleAnalyticsService
    {
        private const string UserId = "&uid";

        private readonly GoogleAnalytics _instance;
        private readonly IAuthService _authService;
        private readonly Tracker _tracker;
        private bool _setUserId = true;

        public GoogleAnalyticsService(
            Context appContext,
            IAppIdService appIdService,
            IAuthService authService)
        {
            _authService = authService;

            _instance = GoogleAnalytics.GetInstance(appContext.ApplicationContext);
            _instance.SetLocalDispatchPeriod(10);

            _tracker = _instance.NewTracker("UA-81915606-2");
            _tracker.EnableExceptionReporting(true);
            _tracker.EnableAdvertisingIdCollection(true);
            _tracker.EnableAutoActivityTracking(true);
            _tracker.SetClientId(appIdService.AnonymousAppId);
        }

        public void RefreshUserId()
        {
            _tracker.Set(UserId, null);
            _setUserId = true;
        }

        public void TrackAppEvent(string eventName, string label = null)
        {
            TrackEvent("App", eventName, label);
        }

        public void TrackExtensionEvent(string eventName, string label = null)
        {
            throw new NotSupportedException();
        }

        public void TrackEvent(string category, string eventName, string label = null)
        {
            var builder = new HitBuilders.EventBuilder();
            builder.SetCategory(category);
            builder.SetAction(eventName);
            if(label != null)
            {
                builder.SetLabel(label);
            }

            SetUserId();
            _tracker.Send(builder.Build());
        }

        public void TrackException(string message, bool fatal)
        {
            var builder = new HitBuilders.ExceptionBuilder();
            builder.SetDescription(message);
            builder.SetFatal(fatal);

            SetUserId();
            _tracker.Send(builder.Build());
        }

        public void TrackPage(string pageName)
        {
            SetUserId();
            _tracker.SetScreenName(pageName);
            _tracker.Send(new HitBuilders.ScreenViewBuilder().Build());
        }

        private void SetUserId()
        {
            if(_setUserId && _authService.IsAuthenticated)
            {
                _tracker.Set(UserId, _authService.UserId);
                _setUserId = false;
            }
        }

        public void Dispatch(Action completionHandler = null)
        {
            _instance.DispatchLocalHits();
            completionHandler?.Invoke();
        }
    }
}
