﻿#if UNITY_IOS
using System;
using InMobiAds.Common;
using System.Collections.Generic;
using InMobiAds.Api;

namespace InMobiAds.Platforms.iOS
{
	public class InMobiPluginClient : IInMobiPluginClient
	{

		public event EventHandler<SdkInitializationStatusArgs> OnInitializationCompleted;

		public InMobiPluginClient ()
		{
		}

		//Initialize InMobi SDK using Publisher Account Id
		public void Init(string accountId){
			string errorMsg = InMobiBinding.Init (accountId);
			IMSDKInitializedEvent (errorMsg);
		}

		public void Init(string accountId, Dictionary<string, object> gdprConsentObject){
			string errorMsg = InMobiBinding.InitwithGDPRConsent (accountId, DictionaryToString(gdprConsentObject));
			IMSDKInitializedEvent (errorMsg);

		}

		private void IMSDKInitializedEvent(string error) {
			SdkInitializationStatusArgs args;
			if (string.IsNullOrEmpty(error)) {
				args = new SdkInitializationStatusArgs () {
					status = InitializationStatus.SUCCESS
				};
			} else {
				args = new SdkInitializationStatusArgs () {
					status = new InitializationStatus(InitializationStatusCodes.ERROR, error)
				};
			}

			this.OnInitializationCompleted?.Invoke(this, args);
		}

		//Set log level
		public void SetLogLevel(string logLevel){
			InMobiBinding.SetLogLevel (logLevel);
		}

		//Set Age
		public void SetAge(int age){
			InMobiBinding.SetAge (age);
		}

		//Set AgeGroup
		public void SetAgeGroup(string ageGroup){
			InMobiBinding.SetAgeGroup (ageGroup);
		}

		//Set AreaCode
		public void SetAreaCode(string areaCode){
			InMobiBinding.SetAreaCode (areaCode);
		}

		//Set PostalCode
		public void SetPostalCode(string postalCode){
			InMobiBinding.SetPostalCode (postalCode);
		}

		//Set Location With City State Country
		public void SetLocationWithCityStateCountry(string city, string state, string country){
			InMobiBinding.SetLocationWithCityStateCountry (city, state, country);
		}

		//Set Year of Birth
		public void SetYearOfBirth(int yearOfBirth){
			InMobiBinding.SetYearOfBirth (yearOfBirth);
		}

		//Set Gender GENDER_MALE or GENDER_FEMALE
		public void SetGender(string gender){
			InMobiBinding.SetGender (gender);
		}

		//set Education EDUCATION_HIGHSCHOOLORLESS, EDUCATION_COLLEGEORGRADUATE, EDUCATION_POSTGRADUATEORABOVE
		public void SetEducation(string education){
			InMobiBinding.SetEducation (education);
		}

		//set Language
		public void SetLanguage(string language){
			InMobiBinding.SetLanguage (language);
		}

		//set Interests
		public void SetInterests(string interests){
			InMobiBinding.SetInterests (interests);
		}

		public void UpdateGdprConsentObject(Dictionary<string, object> gdprConsentObject) {
			InMobiBinding.UpdateGdprConsentObject (DictionaryToString(gdprConsentObject));
		}

		public void SetPublisherProvidedUnifiedId(Dictionary<string, object> publisherProviderUnifiedIds) {
			InMobiBinding.SetPublisherProvidedUnifiedId (DictionaryToString(publisherProviderUnifiedIds));
		}

		private string DictionaryToString(Dictionary < string, object > dictionary) {  
            string dictionaryString = "{";  
            foreach(KeyValuePair < string, object > kvp in dictionary) {  

                string token = "";

                if (kvp.Value is int || kvp.Value is double || kvp.Value is float) {
                    token = kvp.Value.ToString();
                } else if (kvp.Value is bool) {
                    token = kvp.Value.ToString().ToLower();
                } else if (kvp.Value is string) {
                    token = "\""+ kvp.Value + "\"";
                } else if (kvp.Value is System.Collections.IDictionary) {
                    token = DictionaryToString((Dictionary<string, object>)kvp.Value);
                }

                dictionaryString += "\"" + kvp.Key + "\"" + " : " + token + ", ";  
            }  
            return dictionaryString.TrimEnd(',', ' ') + "}";  
        } 
	}
}
#endif

