﻿using UnityEngine;
using UnityEditor;
using Unity.EditorCoroutines.Editor;
using RememorySDK.API;

namespace RememorySDK
{
    public partial class RememorySDKControlPanel : EditorWindow
    {
        public static CaptureAPI[] captures;

        static CaptureAPI selectCapture { get; set; } = null;
        public static Texture2D selectCaptureThumbnail { get; set; } = null;

        //スクロール位置
        private static Vector2 _scrollPosition = Vector2.zero;
        private static Vector2 _infoscrollPosition = Vector2.zero;

        private static bool isNotExistCaptureError = false;

        void ShowDownloadTab()
        {
            if (isNotExistCaptureError)
            {
                ShowNoExistCaptureLayout();
            }
            else
            {
                GetCaptures();
            }

            if (captures != null)
            {
                ShowContents();
            }
        }

        void ShowNoExistCaptureLayout()
        {
            LayoutUtil.WindowLayout("", () =>
            {
                LayoutUtil.VerticalLayout(AlignType.Top, () =>
                {
                    EditorGUILayout.LabelField($"Uploaded capture does not exist.", new GUIStyle(EditorStyles.boldLabel));
                    if (GUILayout.Button("Fetch", LayoutUtil.MiniButtonLayout))
                    {
                        GetCaptures(true);
                    }
                });
            });
        }

        //表示するGUIの設定
        void ShowContents()
        {

            LayoutUtil.Space();

            LayoutUtil.HorizontalLayout(AlignType.Left, () =>
            {
                LayoutUtil.FlexibleHalfWindowLayout("Contents", 350, () =>
                 {
                     LayoutUtil.HorizontalLayout(AlignType.Center, () =>
                     {
                         if (GUILayout.Button("Fetch", LayoutUtil.MiniButtonLayout))
                         {
                             GetCaptures(true);
                         }
                     });

                     _scrollPosition = LayoutUtil.ScrollArea(_scrollPosition, () =>
                     {
                         foreach (var capture in captures)
                         {

                             LayoutUtil.CellWindowLayout($"", () =>
                             {
                                 LayoutUtil.HorizontalLayout(AlignType.Center, () =>
                                 {
                                     LayoutUtil.VerticalLayout(AlignType.Center, () =>
                                     {
                                         // EditorGUILayout.LabelField("ID : " + scene.id, new GUIStyle(EditorStyles.boldLabel));
                                         EditorGUILayout.LabelField("ID : " + capture.id, new GUIStyle(EditorStyles.boldLabel));
                                         EditorGUILayout.LabelField("scene : " + capture.sceneName);
                                         EditorGUILayout.LabelField("name : " + capture.name);
                                     });

                                     LayoutUtil.Space();
                                     if (GUILayout.Button("Select", LayoutUtil.MiniWindowButtonLayout))
                                     {
                                         selectCapture = capture;
                                         selectCaptureThumbnail = null;
                                         _infoscrollPosition = Vector2.zero;
                                         GetThumbnail(selectCapture.thumbnail);
                                     }
                                 });
                             });
                         }
                     });
                 });

                var currentPosition = position;

                LayoutUtil.FlexibleHalfWindowLayout("Info", currentPosition.size.x / 2, () =>
                  {
                      LayoutUtil.SetSpace(20);

                      if (selectCapture != null)
                      {

                          EditorGUILayout.LabelField(selectCapture.name, LayoutUtil.fontSizeH1);

                          LayoutUtil.Space();

                          LayoutUtil.HorizontalLayout(AlignType.Center, () =>
                          {
                              if (selectCaptureThumbnail != null)
                              {
                                  GUIStyle texStyle = new GUIStyle();
                                  texStyle.fixedHeight = 180;// selectCaptureThumbnail.height/2;
                                  texStyle.fixedWidth = 320;// selectCaptureThumbnail.width/2;
                                  GUILayout.Box(selectCaptureThumbnail, texStyle);
                              }
                              else
                              {
                                  GUIStyle texStyle = new GUIStyle();
                                  texStyle.fixedHeight = 180;
                                  texStyle.fixedWidth = 320;
                                  GUILayout.Box("", texStyle);
                              }
                          });

                          _infoscrollPosition = LayoutUtil.ScrollArea(_infoscrollPosition, () =>
                          {
                              LayoutUtil.Space();
                              LayoutUtil.MiniSpace();
                              EditorGUILayout.LabelField("Author", LayoutUtil.fontSizeH3);
                              EditorGUILayout.LabelField(selectCapture.userDisplayName, LayoutUtil.fontSizeH4, LayoutUtil.selectContentsTextLayout);
                              LayoutUtil.MiniSpace();
                              EditorGUILayout.LabelField("ID", LayoutUtil.fontSizeH3);
                              EditorGUILayout.LabelField(selectCapture.id, LayoutUtil.fontSizeH4, LayoutUtil.selectContentsTextLayout);
                              LayoutUtil.MiniSpace();
                              EditorGUILayout.LabelField("Latest Release Date", LayoutUtil.fontSizeH3);

                              string date = (selectCapture.updatedAt == 0) ? "-" : DateUtils.FromUnixTime(selectCapture.updatedAt).ToLocalTime().ToString();
                              EditorGUILayout.LabelField(date, LayoutUtil.fontSizeH4, LayoutUtil.selectContentsTextLayout);

                              // LayoutUtil.Space();

                              // if (GUILayout.Button("Open WebPlayer", LayoutUtil.MiniButtonLayout))
                              // {
                              //     string webPlayerUrl = $"{EditorConstants.WEBPLAYER_URL}/{selectscene.shortId}";
                              //     Application.OpenURL(webPlayerUrl);
                              // } 
                          });

                          LayoutUtil.Space();

                          LayoutUtil.HorizontalLayout(AlignType.Center, () =>
                          {
                              if (GUILayout.Button("Download", LayoutUtil.ButtonLayout))
                              {
                                  Download(selectCapture.id, selectCapture.name);
                              }
                          });
                      }
                      else
                      {
                          EditorGUILayout.LabelField("", new GUIStyle(EditorStyles.boldLabel));
                      }
                      LayoutUtil.Space();
                  });
            });
        }

        void Download(string id, string title)
        {
            string dialogMessege = $"{EditorConstants.DOWNLOAD_ALERT_MESSEGE}「{title}」?";


            bool isOK = EditorUtility.DisplayDialog($"Download Capture", dialogMessege, "OK", "Cancel");

            if (isOK)
            {
                float progress = 0.0f;
                EditorCoroutineUtility.StartCoroutine(RememorySceneDownloader.DownloadCapture(SDKConstants.CONTENTS_FOLDER_PATH, id,
                () =>
                {
                    EditorUtility.ClearProgressBar();
                    // complete
                    AssetDatabase.Refresh();
                    EditorUtility.DisplayDialog("Done", EditorConstants.DOWNLOAD_COMPLETE_MESSEGE, "OK");
                }, null,
                (errorMessage) =>
                {
                    EditorUtility.ClearProgressBar();
                    // error
                    AssetDatabase.Refresh();
                    EditorUtility.DisplayDialog("Error", errorMessage, "OK");
                }, (val) =>
                {
                    progress = val;
                    ShowProgress(progress);
                }), this);
            }
        }

        void GetCaptures(bool isFetch = false)
        {
            if ((captures != null && !isFetch))
            {
                return;
            }

            EditorCoroutineUtility.StartCoroutine(APIManager.GetSDKCaptures((res) =>
            {
                if (res == null)
                {
                    isNotExistCaptureError = true;
                    return;
                }
                isNotExistCaptureError = false;
                captures = res.captures;
            }), this);
        }

        void GetThumbnail(string url)
        {
            if (string.IsNullOrEmpty(url))
            {
                return;
            }

            EditorCoroutineUtility.StartCoroutine(RememoryAPIManager.GetTexture(url, (res) =>
            {
                if (res == null)
                {
                    return;
                }
                selectCaptureThumbnail = res;
            }), this);
        }

        static void ShowProgress(float progress)
        {
            EditorUtility.DisplayProgressBar(EditorConstants.DOWNLOAD_ALERT_TITLE, $"Downloading... {(progress * 100).ToString("F2")}%", progress);
        }
    }
}
