using System.Text;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using SFB;
using UnityEngine.Networking;
using System.IO;
using System;
using Newtonsoft.Json;
using System.Text.RegularExpressions;

public class FileBrowserController : MonoBehaviour, IPointerDownHandler
{
    public InputField inputField;
    // Warning: paths returned by FileBrowser dialogs do not contain a trailing '\' character
    // Warning: FileBrowser can only show 1 dialog at a time

#if UNITY_WEBGL && !UNITY_EDITOR
    //
    // WebGL
    //
    [DllImport("__Internal")]
    private static extern void UploadFile(string gameObjectName, string methodName, string filter, bool multiple);

    public void OnPointerDown(PointerEventData eventData) {
        UploadFile(gameObject.name, "OnFileUpload", ".png, .jpg", false);
        Debug.Log("OnPointerDown");
    }

    // Called from browser
    public void OnFileUpload(string url) {
        StartCoroutine(UpLoadUserData(url));
    }
#else
    //
    // Standalone platforms & editor
    //
    public void OnPointerDown(PointerEventData eventData) { }

    void Start()
    {
        var button =GetComponent<Button>();
        button.onClick.AddListener(OnClick);
    }

    //public void OpenFileBrowser()
    //{
    //    ShowLoadDialogCoroutine($"Выбор объекта", new ExtensionFilter("Vuforia Files", "xml", "dat"));
    //}
#endif

    public void OnClick()
    {
        // Open file
        string[] paths = new string[0];

        paths = StandaloneFileBrowser.OpenFilePanel($"Выбор изображения", "", "png,jpg", false);
     
        if (paths.Length > 0)
        {
            Debug.Log(paths[0]);
            StartCoroutine(UpLoadUserData(paths[0]));
        }
    }

    /// <summary>
    /// Отправка файла на сервер
    /// </summary>
    /// <param name="url"></param>
    /// <returns></returns>
    IEnumerator UpLoadUserData(string url)
    {
       // Debug.Log(url);
        WWWForm form = new WWWForm();
        UnityWebRequest www;
        string file_name;
        string php = "";
        if (Application.platform == RuntimePlatform.WebGLPlayer)
        {
            var deserialize = JsonConvert.DeserializeObject<List<urls>>(url);
            file_name = deserialize[0].file_name;
            Debug.Log($"file image {file_name}");
            var base64 = Regex.Match(deserialize[0].base64, @"data:image/(?<type>.+?),(?<data>.+)").Groups["data"].Value;//match.Groups["type"].Value;
            //string base64 = deserialize[0].base64.Substring(deserialize[0].base64.IndexOf(',') + 1);
            //base64 = base64.Trim('\0');
            byte[] bytes = Convert.FromBase64String(base64);// Encoding.UTF8.GetBytes(deserialize[0].base64);
            Debug.Log($"bytes {bytes.Length}");
            form.AddBinaryData("file", bytes, deserialize[0].file_name);
            php = $"{Application.streamingAssetsPath}/upload.php";
        }
        else
        {
            file_name = Path.GetFileName(url);
            using (FileStream fstream = File.OpenRead(url))
            {
                // преобразуем строку в байты
                byte[] bytes = new byte[fstream.Length];
                fstream.Read(bytes, 0, bytes.Length);
                form.AddBinaryData("file", bytes, file_name);//{Path.GetExtension(url)}
                php = $"http://dev.prmsys.net/positionviewer/StreamingAssets/upload.php";
            }           
        }
        www = UnityWebRequest.Post(php, form);
        yield return www.SendWebRequest();
        if (www.isHttpError)
            Debug.Log(www.error);
        else
        {
            Debug.Log("Uploaded");
            inputField.text = $"{Application.streamingAssetsPath}/{file_name}";
            EditorController.instance.UpdatePanel();
            Debug.Log(www.downloadHandler.text);
        }
      
    }

    class urls
    {
        public string file_name { get; set; }
        public string base64 { get; set; }
    }
}