using Lovense.UnityKit;
using Lovense.UnityKit.Remote;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

public class LovenseRemoteController : MonoBehaviour
{

    private List<RemoteAppData> allAppDatas;
    private RemoteAppData thisRemoteAppData;
    private LovenseRemoteToy thisToy;
    private List<LovenseRemoteToy> thisToys = new List<LovenseRemoteToy>();

    [SerializeField]
    public RemoteItemSelect selectObj;

    [SerializeField]
    public Transform selectRoot;

    public List<RemoteItemSelect> selectList = new List<RemoteItemSelect>();

    private static LovenseRemoteController Instance;

    [SerializeField]
    public VerticalLayoutGroup remoteVlg, toyVlg;

    [SerializeField]
    public FunctionPanel functionPanel;
    [SerializeField]
    public PresetPanel presetPanel;
    [SerializeField]
    public PatternPanel patternPanel;
    [SerializeField]
    public PatternV2Panel patternV2Panel;
    [SerializeField]
    public GameObject operatePanel;
    [SerializeField]
    public GameObject remoteObj, remoteScrollView, toysScrollView, toyObj;
    [SerializeField]
    public Text toChooseApp, toChooseToy;

    [SerializeField]
    public Text errorText;
    [SerializeField]
    public GameObject errorPanel;
    [SerializeField]
    public InputField ipInputField, portInputField;
    [SerializeField]
    public Toggle useHttpToggle;
    [SerializeField]
    public GameObject useInputPanel;
    [SerializeField]
    public GameObject patternV2Btn;
    public bool isGameMode = false;

    //[SerializeField]
   // public Text ipText;

    public List<RemoteItemClick> uiList = new List<RemoteItemClick>();

    private void Awake()
    {
        //if(LovenseRemote.GetInstance().IsAutoGetSupport())
        //{
            //LovenseRemote.GetInstance().SetAutoGetSupport(false);
        //}
        if (Instance == null)
        {
            Instance = this;
        }
        useInputPanel.SetActive(true);
        errorPanel.SetActive(false);
        toysScrollView.SetActive(false);
        remoteScrollView.SetActive(true);
        LovenseRemote.onGetAppsEvent.AddListener(OnSearchLocalApp);
        LovenseRemote.onGetAppsErrorEvent.AddListener(OnGetAppError);
        LovenseRemote.onGetToysEvent.AddListener(OnGetToys);
        LovenseRemote.onGetToysErrorEvent.AddListener(OnGetToysError);
        LovenseRemote.onControlToysEvent.AddListener(OnControlToysResult);
        LovenseRemote.onInitSupportedResultEvent.AddListener(OnInitSupportResult);
        functionPanel.SetCurrentToyCallback(GetSelectedToys);
        presetPanel.SetCurrentToyCallback(GetSelectedToys);
        patternPanel.SetCurrentToyCallback(GetSelectedToys);
        patternV2Panel.SetCurrentToyCallback(GetSelectedToys); 
        patternV2Panel.SetCurrentRemoteCallback(GetCurrentRemote); 
        OperatePanel(false);
    }

    private void OnInitSupportResult(InitSupportCommandStatus arg0)
    {
        if(arg0 == InitSupportCommandStatus.NET_ERROR || arg0 == InitSupportCommandStatus.DATA_ERROR)
        {
            GetSupportByText();
        }
    }
    private void GetSupportByText()
    {
        string supportText = @",symbol,type,showName,func
0,1.6,version,,
1,[  ""l""],Ambi,Ambi,""{  """"p"""": false,  """"r"""": false,  """"v2"""": false,  """"v1"""": false,  """"v"""": true}""
2,""[""""v"""", """"ca""""]"",Mission2,Mission2,""{  """"p"""": false,  """"r"""": false,  """"v2"""": false,  """"v1"""": false,  """"v"""": true}""
3,[  ""su""],c20,C20,""{  """"p"""": false,  """"r"""": false,  """"v2"""": false,  """"v1"""": false,  """"v"""": true}""
4,[  ""t""],Calor,Calor,""{  """"p"""": false,  """"r"""": false,  """"v2"""": false,  """"v1"""": false,  """"v"""": true}""
5,[  ""r""],Diamo,Diamo,""{  """"p"""": false,  """"r"""": false,  """"v2"""": false,  """"v1"""": false,  """"v"""": true}""
6,[  ""j""],Dolce,Dolce,""{  """"p"""": false,  """"r"""": false,  """"v2"""": true,  """"v1"""": true,  """"v"""": true}""
7,[  ""w""],Domi,Domi,""{  """"p"""": false,  """"r"""": false,  """"v2"""": false,  """"v1"""": false,  """"v"""": true}""
8,[  ""p""],Edge,Edge,""{  """"p"""": false,  """"r"""": false,  """"v2"""": true,  """"v1"""": true,  """"v"""": true}""
9,[  ""ef""],Exomoon,Exomoon,""{  """"p"""": false,  """"r"""": false,  """"v2"""": false,  """"v1"""": false,  """"v"""": true}""
10,[  ""x""],Ferri,Ferri,""{  """"p"""": false,  """"r"""": false,  """"v2"""": false,  """"v1"""": false,  """"v"""": true}""
11,[  ""ei""],Flexer,Flexer,""{  """"p"""": false,  """"r"""": false,  """"v2"""": false,  """"v1"""": false,  """"v"""": true,  """"f"""": true}""
12,[  ""n""],Gemini,Gemini,""{  """"p"""": false,  """"r"""": false,  """"v2"""": true,  """"v1"""": true,  """"v"""": true}""
13,[  ""ea""],Gravity,Gravity,""{  """"p"""": false,  """"r"""": false,  """"v2"""": false,  """"v1"""": false,  """"v"""": true,  """"t"""": true,  """"s"""": false}""
14,[  ""ed""],Gush,Gush,""{  """"p"""": false,  """"r"""": false,  """"v2"""": false,  """"v1"""": false,  """"v"""": true}""
15,[  ""ba""],SolacePro,SolacePro,""{  """"p"""": false,  """"r"""": false,  """"v2"""": false,  """"v1"""": false,  """"v"""": false,  """"t"""": true,  """"pos"""": true}""
16,[  ""z""],Hush,Hush,""{  """"p"""": false,  """"r"""": false,  """"v2"""": false,  """"v1"""": false,  """"v"""": true}""
17,[  ""eb""],Hyphy,Hyphy,""{  """"p"""": false,  """"r"""": false,  """"v2"""": false,  """"v1"""": false,  """"v"""": true}""
18,[  ""u""],Lapis,Lapis,""{  """"p"""": false,  """"r"""": false,  """"v2"""": true,  """"v1"""": true,  """"v3"""": true,  """"v"""": true}""
19,[  ""s""],Lush,Lush,""{  """"p"""": false,  """"r"""": false,  """"v2"""": false,  """"v1"""": false,  """"v"""": true}""
20,""[""""toyb"""", """"b""""]"",Max,Max,""{  """"p"""": true,  """"r"""": false,  """"v2"""": false,  """"v1"""": false,  """"v"""": true}""
21,""[""""v"""", """"ca""""]"",Mission,Mission,""{  """"p"""": false,  """"r"""": false,  """"v2"""": false,  """"v1"""": false,  """"v"""": true}""
22,""[  """"toyc"""",  """"toya"""",  """"c"""",  """"a""""]"",Nora,Nora,""{  """"p"""": false,  """"r"""": true,  """"v2"""": false,  """"v1"""": false,  """"v"""": true}""
23,""[""""o"""", """"oc""""]"",Osci,Osci,""{  """"p"""": false,  """"r"""": false,  """"v2"""": false,  """"v1"""": false,  """"v"""": true}""
24,[  ""qa""],QA01,QA01,""{  """"p"""": false,  """"r"""": false,  """"v2"""": true,  """"v1"""": true,  """"v"""": true}""
25,[  ""el""],Ridge,Ridge,""{  """"p"""": false,  """"r"""": true,  """"v2"""": false,  """"v1"""": false,  """"v"""": true}""
26,[  ""h""],Solace,Solace,""{  """"p"""": false,  """"r"""": false,  """"v2"""": false,  """"v1"""": false,  """"v"""": false,  """"t"""": true,  """"d"""": true}""
27,[  ""q""],Tenera,Tenera,""{  """"p"""": false,  """"r"""": false,  """"v2"""": false,  """"v1"""": false,  """"v"""": true,  """"s"""": true}""
28,[  ""sd""],Vulse,Vulse,""{  """"p"""": false,  """"r"""": false,  """"v2"""": false,  """"v1"""": false,  """"v"""": true}""
29,[  ""f""],XMachine,XMachine,""{  """"p"""": false,  """"r"""": false,  """"v2"""": false,  """"v1"""": false,  """"v"""": true,  """"t"""": true}""
30,[  ""ez""],Gush2,Gush2,""{  """"p"""": false,  """"r"""": false,  """"v2"""": false,  """"v1"""": false,  """"v"""": false, """"o"""":true}""
31,[  ""an""],LushAnal,LushAnal,{""v"":true}
32,[  ""s""],Lush2,Lush2,{""v"":true}
33,[  ""s""],Lush3,Lush3,{""v"":true}
34,[  ""s""],Lush4,Lush4,{""v"":true}
35,[  ""s""],LushMini,LushMini,{""v"":true}
36,""[""""toyb"""", """"b""""]"",Max2,Max2,""{  """"p"""": true,  """"r"""": false,  """"v2"""": false,  """"v1"""": false,  """"v"""": true}""
37,[  ""fs""],MiniXmachine,MiniXMachine,""{  """"p"""": false,  """"r"""": false,  """"v2"""": false,  """"v1"""": false,  """"v"""": true,  """"t"""": true}""
38,""[""""o"""", """"oc""""]"",Osci2,Osci2,""{  """"p"""": false,  """"r"""": false,  """"v2"""": false,  """"v1"""": false,  """"v"""": true}""
39,""[""""o"""", """"oc""""]"",Osci3,Osci3,""{""""v"""":true, """"o"""": true}""
40,[  ""q""],Tenera2,Tenera2,""{  """"p"""": false,  """"r"""": false,  """"v2"""": false,  """"v1"""": false,  """"v"""": true,  """"s"""": true}""
41,[  ""qb""],Fizz,Fizz,""{  """"p"""": false,  """"r"""": false,  """"v2"""": false,  """"v1"""": false,  """"v"""": true,  """"s"""": true}""
42,[  ""wd""],Spinel,Spinel,""{""""v"""":true, """"t"""": true}""
43,[  ""cb""],Velvo,Velvo,""{  """"r"""": true,  """"v"""": true}""
";

        LovenseRemote.GetInstance().InitSupportByText(supportText, (InitSupportCommandStatus status) => {
            if (status == InitSupportCommandStatus.SUCCESS)
            {
                Debug.Log("init support success");
            }
            else
            {
                Debug.Log("init support failed");
            }
        });
    }

    private RemoteAppData GetCurrentRemote()
    {
        return thisRemoteAppData; ;
    }

    private void OnControlToysResult(string id, ControlToysResult result)
    {

        if (result.code != 200)
        {
            if (result.code == 500)
            {
                ShowError("code:" + result.code + ",HTTP server not started or disabled.");
            }
            else if (result.code == 400)
            {
                ShowError("code:" + result.code + ",Invalid Command.");
            }
            else if (result.code == 401)
            {
                ShowError("code:" + result.code + ",Toy Not Found.");
            }
            else if (result.code == 402)
            {
                ShowError("code:" + result.code + ",Toy Not Connected.");
            }
            else if (result.code == 403)
            {
                ShowError("code:" + result.code + ",Toy Doesn't Support This Command.");
            }
            else if (result.code == 404)
            {
                ShowError("code:" + result.code + ",Invalid Parameter.");
            }
            else if (result.code == 506)
            {
                ShowError("code:" + result.code + ",Server Error.Restart Lovense Connect.");
            }
            else
            {
                ShowError("code:" + result.code + "," + result.type);
            }
        }
    }

    public void CloseErrorPanel()
    {
        errorText.text = "";
        errorPanel.SetActive(false);
    }

    public void ShowError(string msg)
    {
        errorText.text = msg;
        errorPanel.SetActive(true);
    }

    public static LovenseRemoteController GetInstance()
    {
        return Instance;
    }

    private void OnSearchLocalApp(List<RemoteAppData> appDatas)
    {
        allAppDatas = appDatas;
        ClearAllChildren(true);
        for (int i = 0; i < appDatas.Count; i++)
        {
            GameObject newObj = GameObject.Instantiate(remoteObj, remoteVlg.transform);
            newObj.SetActive(true);
            RemoteItemClick sItem = newObj.GetComponent<RemoteItemClick>();
            sItem.index = i;
            sItem.SetData(appDatas[i]);

        }
        toChooseApp.color = Color.green;
        toChooseToy.color = Color.black;
    }

    public void OnGetToys(List<LovenseRemoteToy> toys)
    {
        uiList.Clear();
        toyVlg.transform.DetachChildren();
        toysScrollView.SetActive(true);
        remoteScrollView.SetActive(false);
        toChooseApp.color = Color.black;
        toChooseToy.color = Color.green;

        foreach (LovenseRemoteToy toy in toys)
        {

            GameObject newObj = GameObject.Instantiate(toyObj, toyVlg.transform);
            newObj.SetActive(true);
            RemoteItemClick sItem = newObj.GetComponent<RemoteItemClick>();
            sItem.SetToyData(toy);
            uiList.Add(sItem);
        }
    }

    public void OnGetToysError(string errorMsg)
    {
        ShowError(errorMsg);
    }

    public void OnGetAppError(string errorMsg)
    {
        ShowError(errorMsg);
    }

    public void SetCurrentSearchAppData(RemoteAppData appData)
    {
        thisRemoteAppData = appData;
        ClearAllChildren(false);
        toysScrollView.SetActive(true);
        remoteScrollView.SetActive(false);
        toChooseApp.color = Color.black;
        toChooseToy.color = Color.green;
        LovenseRemote.GetInstance().GetToys(appData.domain, appData.httpsPort);
    }

    public void SetCurrentToys(List<LovenseRemoteToy> toyDatas)
    {
        thisToy = null;
        thisToys = toyDatas;
        OperatePanel(true);
    }


    public void SetCurrentToys(LovenseRemoteToy toyData)
    {
        thisToy = toyData;
        thisToys.Clear();
        OperatePanel(true);
    }


    private void OnDestroy()
    {
        LovenseRemote.onGetAppsEvent.RemoveListener(OnSearchLocalApp);

    }

    public void OperatePanel(bool open)
    {
        if (open)
        {
            operatePanel.SetActive(true);
            functionPanel.InitSupport();
            functionPanel.gameObject.SetActive(true);
            patternPanel.gameObject.SetActive(false);
            patternV2Panel.gameObject.SetActive(false);
            presetPanel.gameObject.SetActive(false);

            List<LovenseCommandType> types = new List<LovenseCommandType>();
            List<LovenseRemoteToy> toys = GetSelectedToys();
            foreach (LovenseRemoteToy toy in toys)
            {
                List<LovenseCommandType> support = LovenseRemote.GetInstance().GetSupportCommandsByName(toy.name);
                int len = support.Count;
                for (int i = 0; i < len; i++)
                {
                    if (!types.Contains(support[i]))
                    {
                        types.Add(support[i]);
                    }
                }
            }
            patternV2Btn.SetActive(types.Contains(LovenseCommandType.POSITION));
        }
        else
        {
            operatePanel.SetActive(false);
        }
    }

    public void ShowFunctionPanel()
    {
        OperatePanel(true);
    }

    public void ShowPatternPanel()
    {
        operatePanel.SetActive(true);
        functionPanel.gameObject.SetActive(false);
        patternPanel.gameObject.SetActive(true);
        patternV2Panel.gameObject.SetActive(false);
        presetPanel.gameObject.SetActive(false);
    }

    public void ShowPatternV2Panel()
    {
        operatePanel.SetActive(true);
        functionPanel.gameObject.SetActive(false);
        patternPanel.gameObject.SetActive(false);
        patternV2Panel.gameObject.SetActive(true);
        presetPanel.gameObject.SetActive(false);
    }

    public void ShowPresetPanel()
    {
        operatePanel.SetActive(true);
        functionPanel.gameObject.SetActive(false);
        patternPanel.gameObject.SetActive(false);
        patternV2Panel.gameObject.SetActive(false);
        presetPanel.gameObject.SetActive(true);
    }



    public void OnSearch()
    {
        ClearAllChildren(true);
        remoteScrollView.SetActive(true);
        toysScrollView.SetActive(false);
        LovenseRemote.GetInstance().SearchRemoteApp();
    }
    public string thisIp;
    public string thisPort;
    public static bool thisIsUseHttps;
    public string thisToyId;

    public void OnUseInputOpenClick()
    {
        thisIp = ipInputField.text;
        thisPort = portInputField.text;
        thisIsUseHttps = useHttpToggle.isOn;
        if (thisIp == "" || thisPort == "")
        {
            ShowError("please input correct value");
            return;
        }
        ClearAllChildren(false);
        thisRemoteAppData = new RemoteAppData();
        thisRemoteAppData.domain = thisIp;
        if(thisIsUseHttps)
        {
            thisRemoteAppData.httpsPort = Convert.ToInt32(thisPort);
        } else
        {
            thisRemoteAppData.httpsPort = Convert.ToInt32(thisPort);

        }
        LovenseRemote.GetInstance().GetToys(thisIp, Convert.ToInt32(thisPort), thisIsUseHttps);
    }

    public void ClickOnEventApi()
    {
        thisIp = ipInputField.text;
        thisPort = portInputField.text;
        thisIsUseHttps = useHttpToggle.isOn;
        if (thisIp == "" || thisPort == "")
        {
            ShowError("please input correct value");
            return;
        }
        RemoteEventController.thisIp = thisIp;
        RemoteEventController.thisPort = Convert.ToInt32(thisPort);
        RemoteEventController.isSSL = thisIsUseHttps;

        SceneManager.LoadScene("LovenseRemoteToyEvent");


    }



    public void OnChooseLocalAppClick()
    {
        toysScrollView.SetActive(false);
        remoteScrollView.SetActive(true);
        toChooseApp.color = Color.green;
        toChooseToy.color = Color.black;

    }

    public void OnStopClick()
    {
        if (thisToy != null)
        {
            LovenseRemote.GetInstance().SendStopFunction(new List<LovenseRemoteToy>() { thisToy });
        }
        else
        {
            List<LovenseRemoteToy> selectToys = GetSelectedToys();
            LovenseRemote.GetInstance().SendStopFunction(selectToys);
        }
    }



    public void OnExitOperateClick()
    {
        operatePanel.SetActive(false);
    }

    public void OnChooseToysClick()
    {

        if (uiList.Count == 0)
        {
            ShowError("no toy to selected");
        }
        else
        {
            toysScrollView.SetActive(true);
            remoteScrollView.SetActive(false);
            toChooseApp.color = Color.black;
            toChooseToy.color = Color.green;
            thisToys.Clear();

            thisToy = null;
            List<LovenseRemoteToy> toys = new List<LovenseRemoteToy>();
            foreach (RemoteItemClick item in uiList)
            {
                if (item.IsCheck())
                {
                    thisToys.Add(item.GetToyData());
                }
            }
            if (thisToys.Count == 0)
            {
                ShowError("no toy to selected");
                return;
            }
            ShowFunctionPanel();
            ShowSelectedToys();
        }
    }

    public void ShowSelectedToys()
    {
        selectList.Clear();
        selectRoot.GetComponent<HorizontalLayoutGroup>().transform.DetachChildren();
        for (int i = 0; i < thisToys.Count; i++)
        {
            RemoteItemSelect newSelect = Instantiate(selectObj, selectRoot);
            if (newSelect != null)
            {
                newSelect.SetData(thisToys[i]);
                selectList.Add(newSelect);
            }
        }
    }

    public List<LovenseRemoteToy> GetSelectedToys()
    {
        List<LovenseRemoteToy> selectedList = new List<LovenseRemoteToy>();
        if (this.thisToy != null)
        {
            selectedList.Add(this.thisToy);
        }
        else
        {
            foreach (RemoteItemSelect select in selectList)
            {
                if (select.IsCheck())
                {
                    selectedList.Add(select.GetData());
                }
            }
        }
        return selectedList;
    }
    public void ClearAllChildren(bool isApp)
    {
        if (isApp)
        {
            foreach (Transform child in remoteVlg.transform)
            {
                Destroy(child.gameObject);
            }
            remoteVlg.transform.DetachChildren();
            foreach (Transform child in toyVlg.transform)
            {
                Destroy(child.gameObject);
            }
            toyVlg.transform.DetachChildren();
        }
        else
        {
            foreach (Transform child in toyVlg.transform)
            {
                Destroy(child.gameObject);
            }
            toyVlg.transform.DetachChildren();
        }
    }
}
