﻿using System.Collections;
using JLGames.RocketDriver.Actions.Graphicsx;
using UnityEngine;
using UnityEngine.UI;

namespace JLGames.RocketDriver.Games.PanelManager
{
    [RequireComponent(typeof(Image))]
    public class BgExtend : MonoBehaviour, IBgColor, IBgImage, IBgScreenshot
    {
        public void SetColor<T>(T settings, bool onEndOfFrame) where T : IPanelBackgroundSettings
        {
            GetComponent<Image>().color = settings.Color;
        }

        public void SetImage<T>(T settings, bool onEndOfFrame) where T : IPanelBackgroundSettings
        {
            var image = GetComponent<Image>();
            if (null != settings.ImageSprite)
            {
                image.sprite = settings.ImageSprite;
                return;
            }

            if (string.IsNullOrEmpty(settings.ImageBundle) || string.IsNullOrEmpty(settings.ImagePath)) return;
            var loader = PanelManagerShared.Manager.Loader;
            loader.LoadSprite(settings.ImageBundle, settings.ImagePath, (sprite, succ) =>
            {
                if (!succ || null == image) return;
                image.sprite = sprite;
            });
        }

        public void SetScreenshot<T>(T settings, bool onEndOfFrame) where T : IPanelBackgroundSettings
        {
            var image = GetComponent<Image>();
            if (onEndOfFrame)
            {
                SetScreenshot(image, settings.ScreenshotFactor);
                return;
            }

            StartCoroutine(ScreenshotEndFrame(image, settings.ScreenshotFactor));
        }

        private IEnumerator ScreenshotEndFrame(Image image, float blurFactor)
        {
            yield return new WaitForEndOfFrame();
            SetScreenshot(image, blurFactor);
        }

        private void SetScreenshot(Image image, float blurFactor)
        {
            var capTex = ScreenCapture.CaptureScreenshotAsTexture();
            var tex = capTex;
            if (blurFactor < 0.9f)
            {
                tex = Texture2DUtil.Resize(tex, blurFactor);
            }

            var sprite = Sprite.Create(tex, new Rect(0, 0, tex.width, tex.height), new Vector2(0.5f, 0.5f));
            sprite.name = "screenshot";
            image.sprite = sprite;
        }

        private void SetImageEnabled(Image image, bool enable)
        {
            if (image.enabled == enable) return;
            image.enabled = enable;
        }
    }
}