using UnityEngine;
using System;
using System.Collections;

public class ScreenShotManager : SingletonMonoBehaviour<ScreenShotManager> {

    [SerializeField]
    private Texture2D defaultScreenShotTexture = default;

	public string shareImageFileName = "ScreenShot.png";
    public string ImagePath {
        get{ return string.Format("{0}/{1}", Application.persistentDataPath, shareImageFileName); }
    }

#if !UNITY_EDITOR
	public bool ExistsScreenShot{
		get{ return System.IO.File.Exists(ImagePath); }
	}
#else
	private Texture2D texture;
	public bool ExistsScreenShot{
		get{ return texture != null; }
	}
#endif

    void Awake(){
        if(CheckInstance()) return ;
	}

    public void CaptureScreenShot(Action justBeforeAction, Action justAfterAction, Action callback){
        StartCoroutine(_CaptureScreenShot(justBeforeAction, justAfterAction, callback));
    }
    private IEnumerator _CaptureScreenShot(Action justBeforeAction, Action justAfterAction, Action callback){
#if !UNITY_EDITOR
        string imagePath = ImagePath;
        if(ExistsScreenShot){
            System.IO.File.Delete(imagePath);
        }
		yield return null;
		justBeforeAction();
        yield return new WaitForEndOfFrame();
		ScreenCapture.CaptureScreenshot(shareImageFileName);
		yield return null;
		justAfterAction();

        yield return new WaitUntil(() => { return System.IO.File.Exists(imagePath); });
#else
		yield return null;
		justBeforeAction();
        yield return new WaitForEndOfFrame();
		texture = new Texture2D(Screen.width, Screen.height);
		texture.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0);
		texture.Apply();
		yield return null;
		justAfterAction();
#endif
		callback();
    }

    public Texture2D GetTexture(){
        try{
#if !UNITY_EDITOR
            byte[] image = System.IO.File.ReadAllBytes(ImagePath);
            Texture2D texture = new Texture2D(0, 0);
            texture.LoadImage(image);
#endif
            if(texture.isBogus()){
                return defaultScreenShotTexture;
            }else{
                return texture;
            }
        }catch(Exception){
            return defaultScreenShotTexture;
        }
    }

	public Sprite GetSprite(){
		return GetTexture().ToSprite();
	}

    public void ShareTwitter(string message, Action<bool> callback){
#if UNITY_IOS
        ShareManager.Instance.ShareTwitter(message, GetTexture(), callback);
#else
        ShareManager.Instance.ShareTwitter(message, ImagePath, callback);
#endif
    }
    public void ShareFacebook(string message, Action<bool> callback){
#if UNITY_IOS
        ShareManager.Instance.ShareFacebook(message, GetTexture(), callback);
#else
        ShareManager.Instance.ShareFacebook(message, ImagePath, callback);
#endif
    }
}
