﻿using AsmodeeDigital.Common.Plugin.Utils;
using AsmodeeDigital.CrossPromo.Plugin.Domain;
using AsmodeeDigital.CrossPromo.Plugin.Manager;
using AsmodeeDigital.CrossPromo.Plugin.Utils;
using AsmodeeDigital.CrossPromo.Plugin.View;
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;
            public Button BackButton;

            [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;
        private ZoomState _zoomState = ZoomState.NoZoom;

        public void Update()
        {
            if (Input.GetKeyUp(KeyCode.Escape))
            {
                if (ContainerZoomed != null)
                    Zoom(ContainerZoomed);
                else if (CrossPromoView.Instance.ui.MessagePopup.isActiveAndEnabled)
                    CrossPromoView.Instance.HideMessagePopup();
                else
                {
                    Hide();
                }
            }

        }

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

            _product = product;

            uiGameDetailsPopup.BackButton.gameObject.SetActive(CrossPromoView.Instance.ExistPreviousPopup());
            uiGameDetailsPopup.Content.anchoredPosition = Vector2.zero;
            uiGameDetailsPopup.MainContent.anchoredPosition = Vector2.zero;

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

            uiGameDetailsPopup.DescriptionIcon.Init(this);
            StartCoroutine(CrossPromoCacheManager.LoadProductIcon(product, uiGameDetailsPopup.DescriptionIcon.ui.Image, () =>
            {
                uiGameDetailsPopup.DescriptionIcon.HideLoading();
            }));

            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);
                StartCoroutine(CrossPromoCacheManager.LoadProductImage(product, imageDesc, imageContainer.ui.Image, () =>
                {
                    imageContainer.HideLoading();
                }));
            }

            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);
                StartCoroutine(CrossPromoCacheManager.LoadProductAward(product, award.image_url, awardContainer.ui.Icon, null));
            }
        }

        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;
            uiGameDetailsPopup.DescriptionIcon.ui.Image.sprite = null;
            ContainerZoomed = null;

            CrossPromoView.Instance.ShowPreviousPopup(_product);
        }

        public void Zoom(Container container)
        {
            //if (ContainerZoomed != null && ContainerZoomed == container)
            //    zoom = false;

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

            if (_zoomState == ZoomState.Zoomed)
            {
                _zoomState = ZoomState.ZoomAnimation;
                ContainerZoomed.Zoom(false);

                int compteur = 4;
                Action endAnim = () =>
                {
                    compteur--;
                    if (compteur == 0)
                    {
                        ContainerZoomed.transform.SetParent(uiGameDetailsPopup.Content);
                        ContainerZoomed.uiContainer.RectTransform.SetSiblingIndex(_indexSibling);

                        uiGameDetailsPopup.ImagesHorizontalLayoutGroup.enabled = true;
                        ContainerZoomed = null;
                        _zoomState = ZoomState.NoZoom;
                    }
                };

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

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

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

                StartCoroutine(Easing.EaseFromTo(ContainerZoomed.uiContainer.RectTransform.offsetMax, _prevOffsetMax, animSpeed, ease,
                    (Vector2 value) =>
                    {
                        ContainerZoomed.uiContainer.RectTransform.offsetMax = value;
                    },
                        endAnim
                    ));
            }
            else if (_zoomState == ZoomState.NoZoom)
            {
                _zoomState = ZoomState.ZoomAnimation;
                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;

                int compteur = 4;
                Action endAnim = () =>
                {
                    compteur--;
                    if (compteur == 0)
                    {
                        _zoomState = ZoomState.Zoomed;
                    }
                };

                //--- 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);
                    },
                        endAnim
                    ));

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

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

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

        public void DigitalShop()
        {
            AnalyticsManager.Instance.NavigateOnScreen("click_play_now", _product);

            StartCoroutine(WebChecker.WebRequest(
                //---> Connection
                () => { Application.OpenURL(_product.shop_digital_url); },
                //---> No connection
                () => { CrossPromoView.Instance.ShowMessagePopup("Unable to connect to the server. Please check your connection"); }));
        }

        public void PhysicalShop()
        {
            AnalyticsManager.Instance.NavigateOnScreen("click_board_game", _product);

            StartCoroutine(WebChecker.WebRequest(
                //---> Connection
                () => { Application.OpenURL(_product.shop_physical_url); },
                //---> No connection
                () => { CrossPromoView.Instance.ShowMessagePopup("Unable to connect to the server. Please check your connection"); }));
        }

        public void OnCloseButtonClicked()
        {
            Close("click_close");
        }

        public enum ZoomState
        {
            NoZoom,
            ZoomAnimation,
            Zoomed
        }
    }
}
