using System;
using UnityEngine;

namespace Davanci.Nexus
{
    public enum NexusAcquisition { Unknown = 0, Organic = 1, Paid = 2 }

    // Labels each user paid/organic (+ media source) from AppsFlyer attribution, persisted and
    // re-applied every launch so all Firebase events stay segmentable by acquisition source.
    public static class NexusAttribution
    {
        const string KeyAcquisition = "Davanci.Nexus.Attr.Acquisition";
        const string KeyMediaSource = "Davanci.Nexus.Attr.MediaSource";

        // AppsFlyer reports af_status as "Organic"; anything else is treated as paid.
        const string AppsFlyerOrganicStatus = "Organic";

        public const string PropAcquisition = "acquisition";
        public const string PropMediaSource = "media_source";

        public static NexusAcquisition Acquisition => (NexusAcquisition)PlayerPrefs.GetInt(KeyAcquisition, 0);
        public static string MediaSource => PlayerPrefs.GetString(KeyMediaSource, "");
        public static bool IsPaid => Acquisition == NexusAcquisition.Paid;

        public static void Capture(string afStatus, string mediaSource)
        {
            if (!string.IsNullOrEmpty(afStatus))
                PlayerPrefs.SetInt(KeyAcquisition, (int)Classify(afStatus));
            if (!string.IsNullOrEmpty(mediaSource))
                PlayerPrefs.SetString(KeyMediaSource, mediaSource);
            PlayerPrefs.Save();
            ReapplyToAnalytics();
        }

        public static void ReapplyToAnalytics()
        {
            if (Acquisition != NexusAcquisition.Unknown)
                DavanciNexus.SetUserProperty(PropAcquisition, Acquisition.ToString().ToLowerInvariant());
            if (!string.IsNullOrEmpty(MediaSource))
                DavanciNexus.SetUserProperty(PropMediaSource, MediaSource);
        }

        static NexusAcquisition Classify(string afStatus) =>
            afStatus.Equals(AppsFlyerOrganicStatus, StringComparison.OrdinalIgnoreCase)
                ? NexusAcquisition.Organic
                : NexusAcquisition.Paid;
    }
}
