﻿using AsmodeeDigital.Common.Plugin.Utils;
using AsmodeeDigital.CrossPromo.Plugin.Domain;
using System;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.UI;

namespace AsmodeeDigital.CrossPromo.Plugin.UI
{
    public class GameDetailsPopup : CrossPromoPopup
    {
        [Serializable]
        public class UIGameDetailsPopup
        {
            [Header("Header")]
            public TextMeshProUGUI Name;

            [Header("Main")]
            public RectTransform MainContent;

            [Header("Images and Videos")]
            public RectTransform Content;
            public ScrollRect ImagesScrollView;
            public HorizontalLayoutGroup ImagesHorizontalLayoutGroup;

            [Header("Description - Left")]
            public Transform DescriptionLeftColumn;
            public ImageContainer DescriptionIcon;
            public Button BuyDigitalButton;
            public Button BuyPhysicalButton;

            [Header("Description - Right")]
            public TextMeshProUGUI Description;

            [Header("Zoomed Image")]
            public RectTransform ZoomedImageContainer;
            public Image BackgroundZoomContainer;
        }

        public UIGameDetailsPopup uiGameDetailsPopup;

        [Header("Prefabs")]
        public ImageContainer ImageContainerPrefab;
        public VideoContainer VideoContainerPrefab;
        public AwardContainer AwardContainerPrefab;

        //private List<ImageContainer> _imageContainers = new List<ImageContainer>();
        //private List<VideoContainer> _videoContainers = new List<VideoContainer>();
        private List<AwardContainer> _awardContainers = new List<AwardContainer>();

        [HideInInspector]
        public Container ContainerZoomed;
        private int _indexSibling;
        private Vector2 _prevOffsetMin;
        private Vector2 _prevOffsetMax;
        private Product _product;

        public void Update()
        {
            if(Input.GetKeyUp(KeyCode.Escape))
            {
                if (ContainerZoomed != null)
                    Zoom(ContainerZoomed);
                else
                {
                    Hide();
                }
            }

        }

        public void Show(Product product)
        {
            base.Show();

            _product = product;

            uiGameDetailsPopup.Content.anchoredPosition = Vector2.zero;
            uiGameDetailsPopup.MainContent.anchoredPosition = Vector2.zero;

            uiGameDetailsPopup.Name.text = product.name;
            uiGameDetailsPopup.Description.text = product.description;

            uiGameDetailsPopup.DescriptionIcon.Init(this, product.icon_url);

            uiGameDetailsPopup.BuyDigitalButton.gameObject.SetActive(!string.IsNullOrEmpty(product.shop_digital_url));
            uiGameDetailsPopup.BuyPhysicalButton.gameObject.SetActive(!string.IsNullOrEmpty(product.shop_physical_url));

            //_imageContainers.ForEach(c => c.gameObject.SetActive(false));
            //_videoContainers.ForEach(c => c.gameObject.SetActive(false));
            _awardContainers.ForEach(c => c.gameObject.SetActive(false));

            int index = 0;
            foreach (string videoUrl in product.videos)
            {
                //VideoContainer videoContainer = _videoContainers.Find(c => !c.gameObject.activeSelf);
                VideoContainer videoContainer = null;

                if (videoContainer == null)
                {
                    videoContainer = Instantiate<VideoContainer>(VideoContainerPrefab);
                    videoContainer.transform.SetParent(uiGameDetailsPopup.Content);
                    videoContainer.transform.localScale = Vector3.one;
                    videoContainer.transform.SetSiblingIndex(index++);
                    //_videoContainers.Add(videoContainer);
                }

                videoContainer.Init(this, videoUrl);
            }

            foreach (string imageDesc in product.images)
            {
                //ImageContainer imageContainer = _imageContainers.Find(c => !c.gameObject.activeSelf);
                ImageContainer imageContainer = null;

                if (imageContainer == null)
                {
                    imageContainer = Instantiate<ImageContainer>(ImageContainerPrefab);
                    imageContainer.transform.SetParent(uiGameDetailsPopup.Content);
                    imageContainer.transform.localScale = Vector3.one;

                    //_imageContainers.Add(imageContainer);
                }

                imageContainer.Init(this, imageDesc);
            }

            foreach (Award award in product.awards)
            {
                AwardContainer awardContainer = _awardContainers.Find(c => !c.gameObject.activeSelf);

                if (awardContainer == null)
                {
                    awardContainer = Instantiate<AwardContainer>(AwardContainerPrefab);

                    awardContainer.transform.SetParent(uiGameDetailsPopup.DescriptionLeftColumn);
                    awardContainer.transform.localScale = Vector3.one;

                    _awardContainers.Add(awardContainer);
                }

                awardContainer.Init(award);
            }

        }

        public override void Hide()
        {
            base.Hide();

            if (ContainerZoomed != null)
            {
                ContainerZoomed.Zoom(false);
                ContainerZoomed.uiContainer.Layout.minWidth = ContainerZoomed.uiContainer.Layout.preferredWidth;
                ContainerZoomed.uiContainer.Layout.minHeight = ContainerZoomed.uiContainer.Layout.preferredHeight;
            }

            uiGameDetailsPopup.Content.transform.localPosition = Vector3.zero;

            ContainerZoomed = null;
        }

        public void Zoom(Container container)
        {
            bool zoom = true;

            if (ContainerZoomed != null && ContainerZoomed == container)
                zoom = false;

            float animSpeed = 0.25f;
            Easer ease = Ease.CubeInOut;

            if (!zoom)
            {
                ContainerZoomed.Zoom(false);

                StartCoroutine(Easing.EaseFromTo(0.75f, 0f, animSpeed+0.01f, ease,
                    (float value) =>
                    {
                        uiGameDetailsPopup.BackgroundZoomContainer.color = new Color(0f, 0f, 0f, value);
                    },
                    () =>
                    {
                        ContainerZoomed.transform.SetParent(uiGameDetailsPopup.Content);
                        ContainerZoomed.uiContainer.RectTransform.SetSiblingIndex(_indexSibling);

                        uiGameDetailsPopup.ImagesHorizontalLayoutGroup.enabled = true;
                        ContainerZoomed = null;
                    }));

                StartCoroutine(Easing.EaseFromTo(0f, 1f, animSpeed + 0.15f, ease,
                    (float value) =>
                    { },
                    () =>
                    {
                        uiGameDetailsPopup.ImagesScrollView.horizontal = true;
                    }));

                StartCoroutine(Easing.EaseFromTo(ContainerZoomed.uiContainer.RectTransform.offsetMin, _prevOffsetMin, animSpeed, ease,
                    (Vector2 value) =>
                    {
                        ContainerZoomed.uiContainer.RectTransform.offsetMin = value;
                    }));

                StartCoroutine(Easing.EaseFromTo(ContainerZoomed.uiContainer.RectTransform.offsetMax, _prevOffsetMax, animSpeed, ease,
                    (Vector2 value) =>
                    {
                        ContainerZoomed.uiContainer.RectTransform.offsetMax = value;
                    }));
            }
            else
            {
                uiGameDetailsPopup.ImagesScrollView.horizontal = false;
                uiGameDetailsPopup.ImagesHorizontalLayoutGroup.enabled = false;

                ContainerZoomed = container;
                ContainerZoomed.Zoom(true);

                _indexSibling = container.uiContainer.RectTransform.GetSiblingIndex();

                container.transform.SetParent(uiGameDetailsPopup.ZoomedImageContainer, true);

                Vector3 position = container.transform.position;

                Vector2 midPoint = new Vector2(0.5f, 0.5f);

                container.uiContainer.RectTransform.pivot = midPoint;
                container.uiContainer.RectTransform.anchorMin = new Vector2(0, 0);
                container.uiContainer.RectTransform.anchorMax = new Vector2(1, 1);

                container.uiContainer.RectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, container.uiContainer.Layout.preferredWidth);
                container.uiContainer.RectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, container.uiContainer.Layout.preferredHeight);

                container.transform.position = position;

                //--- Animations
                _prevOffsetMin = container.uiContainer.RectTransform.offsetMin;
                _prevOffsetMax = container.uiContainer.RectTransform.offsetMax;

                StartCoroutine(Easing.EaseFromTo(0f, 0.75f, animSpeed, ease,
                    (float value) =>
                    {
                        uiGameDetailsPopup.BackgroundZoomContainer.color = new Color(0f, 0f, 0f, value);
                    }));

                StartCoroutine(Easing.EaseFromTo(container.uiContainer.RectTransform.offsetMin, Vector2.zero, animSpeed, ease,
                    (Vector2 value) =>
                    {
                        container.uiContainer.RectTransform.offsetMin = value;
                    }));

                StartCoroutine(Easing.EaseFromTo(container.uiContainer.RectTransform.offsetMax, Vector2.zero, animSpeed, ease,
                    (Vector2 value) =>
                    {
                        container.uiContainer.RectTransform.offsetMax = value;
                    }));

                StartCoroutine(container.transform.MoveTo(Vector3.zero, animSpeed, ease));
                //---
            }
        }

        public void DigitalShop()
        {
            Application.OpenURL(_product.shop_digital_url);
        }

        public void PhysicalShop()
        {
            Application.OpenURL(_product.shop_physical_url);
        }
    }
}
