#if UNITY_IOS || UNITY_IPHONE

using System.IO;
using UnityEditor.Callbacks;
using UnityEditor;
using System;
using UnityEngine;
using UnityEditor.iOS.Xcode;
using System.Text.RegularExpressions;

/// <summary>
/// PostProcessor script to automatically fill all required dependencies
/// </summary>
public class IronSourcePlistProcessor
{
    [PostProcessBuild]
    public static void OnPostprocessBuild(BuildTarget buildTarget, string buildPath)
    {
        if (File.Exists(IronSourceMediationSettings.IRONSOURCE_SETTINGS_ASSET_PATH))
        {
            if (buildTarget == BuildTarget.iOS)
            {
                /*
                 * PBXProject
                 */
                string plistPath = Path.Combine(buildPath, "Info.plist");
                PBXProject project = new PBXProject();
                string projectPath = PBXProject.GetPBXProjectPath(buildPath);
                project.ReadFromFile(projectPath);
                PlistDocument plist = new PlistDocument();
                plist.ReadFromString(File.ReadAllText(plistPath));
                if (plist != null)
                {
                    // Get root
                    PlistElementDict rootDict = plist.root;

                    // Check if SKAdNetworkItems already exists
                    PlistElementArray SKAdNetworkItems = null;
                    if (rootDict.values.ContainsKey("SKAdNetworkItems"))
                    {
                        try
                        {
                            SKAdNetworkItems = rootDict.values["SKAdNetworkItems"] as PlistElementArray;
                        }
                        catch (Exception e)
                        {
                            Debug.LogWarning(string.Format("Could not obtain SKAdNetworkItems PlistElementArray: {0}", e.Message));
                        }
                    }

                    //Add IronSource's SKAdNetwork ID
                    if (IronSourceMediationSettingsInspector.IronSourceMediationSettings.AddIronsourceSkadnetworkID)
                    {
                        // If not exists, create it
                        if (SKAdNetworkItems == null)
                        {
                            SKAdNetworkItems = rootDict.CreateArray("SKAdNetworkItems");
                        }

                        string plistContent = File.ReadAllText(plistPath);
                        if (!plistContent.Contains(IronSourceConstants.IRONSOURCE_SKAN_ID_KEY))
                        {
                            PlistElementDict SKAdNetworkIdentifierDict = SKAdNetworkItems.AddDict();
                            SKAdNetworkIdentifierDict.SetString("SKAdNetworkIdentifier", IronSourceConstants.IRONSOURCE_SKAN_ID_KEY);
                        }
                    }

           

                    File.WriteAllText(plistPath, plist.WriteToString());
                }
            }
        }
        if ( File.Exists(IronSourceMediatedNetworkSettings.MEDIATION_SETTINGS_ASSET_PATH))
        {
            if (buildTarget == BuildTarget.iOS)
            {
                /*
                 * PBXProject
                 */
                string plistPath = Path.Combine(buildPath, "Info.plist");
                PBXProject project = new PBXProject();
                string projectPath = PBXProject.GetPBXProjectPath(buildPath);
                project.ReadFromFile(projectPath);
                PlistDocument plist = new PlistDocument();
                plist.ReadFromString(File.ReadAllText(plistPath));
                if (plist != null)
                {
                    // Get root
                    PlistElementDict rootDict = plist.root;

        
                    //Adding AdMob App ID to Plist
                    if (IronSourceMediatedNetworkSettingsInspector.IronSourceMediatedNetworkSettings.EnableAdmob == true)
                    {
                        string appId = IronSourceMediatedNetworkSettingsInspector.IronSourceMediatedNetworkSettings.AdmobIOSAppId;
                        if (appId.Length == 0)
                        {
                            StopBuildWithMessage(
                                "iOS AdMob app ID is empty. Please enter your app ID to run ads properly");
                        }
                        else if (!Regex.IsMatch(appId, "^[a-zA-Z0-9-~]*$"))
                        {
                            StopBuildWithMessage(
                                "iOS AdMob app ID is not valid. Please enter a valid app ID to run ads properly");
                        }
                        else
                        {
                            plist.root.SetString("GADApplicationIdentifier", appId);
                        }
                    }

                    File.WriteAllText(plistPath, plist.WriteToString());
                }
            }
        }
    }
    private static void StopBuildWithMessage(string message)
    {
        string prefix = "[IronSourceApplicationSettings] ";

        EditorUtility.DisplayDialog(
            "IronSource Developer Settings", "Error: " + message, "", "");

#if UNITY_2017_1_OR_NEWER
        throw new BuildPlayerWindow.BuildMethodException(prefix + message);
#else
                    throw new OperationCanceledException(prefix + message);
#endif
    }
}
#endif