﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using UnityEngine;
using PRequest = Playtomic.PRequest;

public class IdnetTracker : MonoBehaviour
{
    public static void CustomEvent(string CustomEventName, object CustomEventValue = null)
    {
        if (CustomEventValue == null)
            Idnet.I.StartCoroutine(CR_SendCustomTrackerStats(CustomEventName));
        else
            Idnet.I.StartCoroutine(CR_SendCustomTrackerStats(CustomEventName, CustomEventValue));
    }

    public static IEnumerator CR_SendCustomTrackerStats(string CustomEventName, object CustomEventValue = null)
    {
#if UNITY_WEBGL && !UNITY_EDITOR        
        while (string.IsNullOrEmpty(Idnet.I.RefererDomain))
            yield return null;

        var url = Idnet.TrackerApiUrl;
        var jsonData = new Dictionary<string, object>();

        var absoluteUrl = Idnet.I.RefererDomain;

        if (absoluteUrl.StartsWith("file://") || string.IsNullOrEmpty(absoluteUrl))
        {
            // Does not work in the editor or locally because absoluteUrl cannot be parsed by the server.
            yield break;
        }

        Dictionary<string, string> customEventJson = new Dictionary<string, string>();
        if (CustomEventValue == null)
        {
            customEventJson.Add("name", CustomEventName.ToString());
        }
        else
        {
            customEventJson.Add("name", CustomEventName.ToString());
            customEventJson.Add("value", CustomEventValue.ToString());
        }

        if (string.IsNullOrEmpty(Idnet.I.TrackerUuid))
        {
            jsonData = new Dictionary<string, object>
            {
                {"event", "custom"},
                {"game_id", Idnet.AppId},
                {"custom_event", customEventJson},
                {"domain", absoluteUrl},
                {"user_agent", Idnet.I.UserAgent},
#if UNITY_WEBGL
                {"sdk", "u-webgl"}
#else
                {"sdk","u-webpl"}
#endif
            };
        }
        else
        {
            jsonData = new Dictionary<string, object>
            {
                {"event", "custom"},
                {"game_id", Idnet.AppId},
                {"custom_event", customEventJson},
                {"user_id", Idnet.I.TrackerUuid},
                {"domain", absoluteUrl},
                {"uuid", Idnet.I.TrackerUuid},
                {"user_agent", Idnet.I.UserAgent},
#if UNITY_WEBGL
                {"sdk", "u-webgl"}
#else
                {"sdk","u-webpl"}
#endif
            };
        }

        var encodedJson = Encoding.UTF8.GetBytes(Newtonsoft.Json.JsonConvert.SerializeObject(jsonData));
        WWW www;
        PResponse response;

        www = new WWW(url, encodedJson, Idnet.Headers);

        yield return www;

        response = PRequest.Process(www);

        if (response.success)
        {
            Debug.Log("-CustomEvent Tracker data posted successfully.");
        }
        else
        {
            Debug.Log(" -CustomEvent Tracker failed. " + response.errorcode + " | " + response.errormessage);
        }
#else
        yield break;
#endif
    }

#if UNITY_WEBGL && !UNITY_EDITOR        
    public static IEnumerator CR_SendTrackerStats(string Mode)
    {
        //Unrelated to tracker,but the best place to implement it. 
        //Get host for showing achievements(alternative for cdn CORS issue not retrieving images in achievements),this is not a part of tracker
        Idnet.I.GetDomain();


        //Get Navigator UserAgent
        Idnet.I.GetUserAgent();

        //Get Operating system details
        Idnet.I.GetOSDetails();

        while (string.IsNullOrEmpty(Idnet.I.UserAgent) && string.IsNullOrEmpty(Idnet.I.RefererDomain))
            yield return null;


        var url = Idnet.TrackerApiUrl;
        var jsonData = new Dictionary<string, object>();
        // Ignore local testing.

        var absoluteUrl = Idnet.I.RefererDomain;


        if (absoluteUrl.StartsWith("file://") || string.IsNullOrEmpty(absoluteUrl))
        {
            // Does not work in the editor or locally because absoluteUrl cannot be parsed by the server.
            yield break;
        }


        if (string.IsNullOrEmpty(Idnet.I.TrackerUuid))
        {
            jsonData = new Dictionary<string, object>
            {
                {"event", Mode},
                {"game_id", Idnet.AppId},
                {"domain", absoluteUrl},
                {"user_agent", Idnet.I.UserAgent},
#if UNITY_WEBGL
                {"sdk", "u-webgl"}
#else
                {"sdk","u-webpl"}
#endif
            };
        }
        else
        {
            jsonData = new Dictionary<string, object>
            {
                {"event", Mode},
                {"game_id", Idnet.AppId},
                {"domain", absoluteUrl},
                {"uuid", Idnet.I.TrackerUuid},
                {"user_agent", Idnet.I.UserAgent},
#if UNITY_WEBGL
                {"sdk", "u-webgl"}
#else
                {"sdk","u-webpl"}
#endif
            };
        }

        var json = PJSON.JsonEncode(jsonData);
        var encodedJson = Encoding.UTF8.GetBytes(json);
        PResponse response;

        var www = new WWW(url, encodedJson, Idnet.Headers);
        yield return www;
        response = Playtomic.PRequest.Process(www);

        if (response.success)
        {
            if (string.IsNullOrEmpty(Idnet.I.TrackerUuid))
            {
                Idnet.I.TrackerUuid = response.json["uuid"] as string;
                Idnet.I.Log(" TrackerUuid Success!. "
#if UNITY_EDITOR || IDNET_DEBUG
                            + " Refferer: " + Idnet.I.RefererDomain + " uuid: " + Idnet.I.TrackerUuid
#endif
                );
            }
            else
            {
                Idnet.I.Log(" Tracker Success!. Using cached UUID "
#if UNITY_EDITOR || IDNET_DEBUG
                            + " Refferer: " + Idnet.I.RefererDomain + " uuid: " + Idnet.I.TrackerUuid
#endif
                );
            }
        }
        else
        {
            Debug.LogError(" - Tracker failed. " + response.errorcode + " | " + response.errormessage);
        }
    }

#endif
}