using RTLTMPro;
using System;
using UnityEngine;
using UnityEngine.UI;
#if UNITY_EDITOR
using UnityEditor;
#endif

namespace Adplay.View
{
    public class AdPlayTemplate : MonoBehaviour
    {
        [SerializeField] private RectTransform rectTransform;
        [SerializeField] private Image image;
        [SerializeField] private Button clickButton;
        [SerializeField] private RTLTextMeshPro titleText, descriptionText, clickButtonText;
        internal event Action OnShow, OnDeactive, OnSelfDestroy;

        internal Image Image => image;
        internal Button ClickButton => clickButton;
        internal RectTransform RectTransform => rectTransform;

        internal RTLTextMeshPro TitleText => titleText;
        internal RTLTextMeshPro DescriptionText => descriptionText;
        internal RTLTextMeshPro ClickButtonText => clickButtonText;

        internal void Show()
        {
            gameObject.SetActive(true);
        }

        internal void Hide()
        {
            gameObject.SetActive(false);
        }

        internal void SetSprite(Sprite sprite)
        {
            image.sprite = sprite;
        }

        internal void AddClick(Action onClick)
        {
            ClickButton.onClick.AddListener(() => onClick?.Invoke());
        }

        internal void SetSize(float x, float y)
        {
            rectTransform.sizeDelta = new(x, y);
        }

        public void SetImage(Image image)
        {
            this.image = image;
        }

        public void SetTitle(RTLTextMeshPro title)
        {
            titleText = title;
        }

        public void FullSizeToParent()
        {
            if (rectTransform == null)
            {
                Debug.LogError($"FullSizeToParent cant work because Rect Transform is null");
            }
            rectTransform.anchorMin = Vector2.zero;
            rectTransform.anchorMax = Vector2.one;
            rectTransform.offsetMin = Vector2.zero;
            rectTransform.offsetMax = Vector2.zero;
        }

        public void SetRectTransform(RectTransform rectTransform)
        {
            this.rectTransform = rectTransform;
        }

        public void SetDescription(RTLTextMeshPro description)
        {
            descriptionText = description;
        }

        public void SetClickButtonText(RTLTextMeshPro buttonText)
        {
            clickButtonText = buttonText;
        }

        private void OnEnable()
        {
            OnShow?.Invoke();
        }

        private void OnDisable()
        {
            OnDeactive?.Invoke();
        }

        private void OnDestroy()
        {
            OnSelfDestroy?.Invoke();
        }

    }

#if UNITY_EDITOR

    [CustomEditor(typeof(AdPlayTemplate))]
    public class AdPlayTemplateEditor : Editor
    {
        SerializedProperty rectTransform;
        SerializedProperty image;
        SerializedProperty clickButton;
        SerializedProperty titleText;
        SerializedProperty descriptionText;
        SerializedProperty clickButtonText;

        private void OnEnable()
        {
            rectTransform = serializedObject.FindProperty("rectTransform");
            image = serializedObject.FindProperty("image");
            clickButton = serializedObject.FindProperty("clickButton");
            titleText = serializedObject.FindProperty("titleText");
            descriptionText = serializedObject.FindProperty("descriptionText");
            clickButtonText = serializedObject.FindProperty("clickButtonText");
        }

        public override void OnInspectorGUI()
        {
            serializedObject.Update();

            DrawField(rectTransform, "Important: RectTransform is used to set the ad full size to parent. Method FullSizeToParent will not work correctly without it.", MessageType.Error);
            DrawField(image, "REQUIRED: This Image component is used to display the ad. The SDK will not work correctly without it.", MessageType.Error);
            DrawField(clickButton, "REQUIRED: This Button is used to handle ad clicks. PopUp and PopUpButton will not work correctly without it.", MessageType.Error);

            DrawField(titleText, "IMPORTANT: Text component used for the PopUp and PopUpButton title.", MessageType.Info);
            DrawField(descriptionText, "IMPORTANT: Text component used for the PopUp description.", MessageType.Info);
            DrawField(clickButtonText, "IMPORTANT: Text component used for the PopUpButton text.", MessageType.Info);

            serializedObject.ApplyModifiedProperties();
        }

        private void DrawField(SerializedProperty property, string message, MessageType type)
        {
            if (property.objectReferenceValue == null)
            {
                EditorGUILayout.HelpBox(message, type);
            }

            EditorGUILayout.PropertyField(property);

            EditorGUILayout.Space();
        }
    }

#endif

}
