#if UNITY_EDITOR
using Adplay.Behaviours;
using Adplay.Config;
using System.Collections.Generic;
using System.Linq;
using UnityEditor;
using UnityEditor.SceneManagement;
using UnityEngine;

namespace Adplay
{

    public class AdPlayCustomEditor : MonoBehaviour
    {

        [MenuItem("Window/Ad Play/Spawn Prefab")]
        public static void SpawnPrefabInScene()
        {
            var manager = FindAnyObjectByType<AdPlayManager>();
            if (manager != null)
            {
                Debug.Log("Prefab already exist in scene");
                return;
            }
            var adPlayPrefabs = FindAllPrefabs<AdPlayManager>();
            var adPlayPrefab = adPlayPrefabs.FirstOrDefault();
            if (adPlayPrefab == null)
            {
                Debug.LogError("Ad Play Manager prefab not found!");
                return;
            }
            PrefabUtility.InstantiatePrefab(adPlayPrefab);

            // Mark the scene dirty so Unity saves changes
            EditorSceneManager.MarkSceneDirty(EditorSceneManager.GetActiveScene());
        }

        [MenuItem("Window/Ad Play/App key")]
        public static void SetAppKey()
        {
            var apiConfig = FindAll<ApiConfigData>().FirstOrDefault();
            if (apiConfig == null)
            {
                //create api config
                Debug.LogError("Api config not found - call ad play support");
                return;
            }
            Selection.activeObject = apiConfig;
        }

        private static List<T> FindAll<T>() where T : Object
        {
            string[] guids = AssetDatabase.FindAssets($"t:{typeof(T)}");
            T[] assets = new T[guids.Length];

            for (int i = 0; i < guids.Length; i++)
            {
                string path = AssetDatabase.GUIDToAssetPath(guids[i]);
                assets[i] = AssetDatabase.LoadAssetAtPath<T>(path);
            }
            return assets.ToList();
        }

        private static List<T> FindAllPrefabs<T>() where T : MonoBehaviour
        {
            string[] guids = AssetDatabase.FindAssets("t:prefab");
            var result = new List<T>();
            foreach (string guid in guids)
            {
                string path = AssetDatabase.GUIDToAssetPath(guid);
                GameObject prefab = AssetDatabase.LoadAssetAtPath<GameObject>(path);
                if (prefab == null)
                    continue;
                var component = prefab.GetComponent<T>();
                if (component != null)
                {
                    result.Add(component);
                }
            }
            return result;
        }


    }
}
#endif