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

public class LovenseDongleDetails : MonoBehaviour
{
    [SerializeField]
    public DongleToySelect selectToy;

    [SerializeField]
    public Transform selectRoot;

    public List<DongleToySelect> selectList = new List<DongleToySelect>();
    [SerializeField]
    public FunctionPanel functionPanel;
    [SerializeField]
    public PatternPanel patternPanel;
    [SerializeField]
    public PresetPanel presetPanel;
    [SerializeField]
    PatternV2Panel patternV2Panel;
    [SerializeField]
    public Text errorText;
    [SerializeField]
    public GameObject errorPanel;
    [SerializeField]
    public Toggle thisConnected;
    [SerializeField]
    public GameObject supportDataReportingBtn,supportPatternV2;
    public List<LovenseDongleToy> thisToys;
    private bool isConnected = false;
    private bool singleToys = true;


    private void Awake()
    {
        functionPanel.SetGetToysCallback(GetCheckToys);
        patternPanel.SetGetToysCallback(GetCheckToys);
        presetPanel.SetGetToysCallback(GetCheckToys);
        patternV2Panel.SetCurrentToyCallback(GetCheckToys);
        
        supportDataReportingBtn.SetActive(false);
        errorPanel.SetActive(false);
        thisToys = DongleGlobal.GetInstance().thisToys;
        ShowFunctionPanel();
        if (thisToys != null && thisToys.Count == 1)
        {
            if (!LovenseDongleTools.GetInstance().IsConnected(thisToys[0].id))
            {
                LovenseDongleTools.GetInstance().ConnectToys(new List<string> { thisToys[0].id });
            }
            else
            {
                thisConnected.isOn = true;
                LovenseDongleTools.GetInstance().GetBattery(thisToys[0].id);
                if (thisToys[0].isSupportDataReporting)
                {
                    supportDataReportingBtn.SetActive(true);
                } else
                {
                    LovenseDongleTools.GetInstance().CheckDataReportingEnable(thisToys[0].id);
                }
            }
        }
        else
        {
            InitCheck();
            List<string> toys = GetCheckToys();
            LovenseDongleTools.GetInstance().ConnectToys(toys);
            foreach(LovenseDongleToy toy in thisToys )
            {
                if (toy.isSupportDataReporting)
                {
                    supportDataReportingBtn.SetActive(true);
                }
            }
        }
        supportPatternV2.SetActive(LovenseDongleTools.GetInstance().isSupportCommand(thisToys[0].id, LovenseCommandType.POSITION));

        LovenseDongleTools.onResultCodeEvent.AddListener(OnErrorCodeResult);
        LovenseDongleTools.onConnectChangeEvent.AddListener(OnConnectedChange);
        LovenseDongleTools.onGetToyDataReportingEnabled.AddListener(OnGetToyReportingEnabled);
    }


    private void OnDestroy()
    {
        LovenseDongleTools.onResultCodeEvent.RemoveListener(OnErrorCodeResult);
        LovenseDongleTools.onConnectChangeEvent.RemoveListener(OnConnectedChange);
        LovenseDongleTools.onGetToyDataReportingEnabled.RemoveListener(OnGetToyReportingEnabled);
    }






    public void OnGetToyReportingEnabled(string toyId)
    {
        if (thisToys != null && thisToys.Count == 1)
        {
            if (toyId == thisToys[0].id)
            {
                thisToys[0].isSupportDataReporting = true;
                supportDataReportingBtn.SetActive(true);
            }
        }
        else if (thisToys != null)
        {
            foreach (LovenseDongleToy toy in thisToys)
            {
                if (toy.id == toyId)
                {
                    thisToys[0].isSupportDataReporting = true;
                    supportDataReportingBtn.SetActive(true);
                }
            }
        }
    }

    public void OnConnectedChange(string toyId, bool connected)
    {
        if (thisToys != null && thisToys[0].id == toyId)
        {
            thisToys[0].isConnected = connected;
            isConnected = connected;
            if (isConnected)
            {
                thisConnected.isOn = true;
                LovenseDongleTools.GetInstance().GetBattery(thisToys[0].id);
                if (string.IsNullOrEmpty(thisToys[0].type))
                {
                    LovenseDongleTools.GetInstance().GetDeviceType(thisToys[0].id);
                }
                ShowFunctionPanel();
            }
            else
            {
                thisConnected.isOn = connected;
            }
        }
        else if (thisToys != null)
        {
            LovenseDongleToy toy = thisToys.Find(t => t.id == toyId);
            if (toy != null)
            {
                toy.isConnected = connected;
                if (connected)
                {
                    if (string.IsNullOrEmpty(toy.type))
                    {
                        LovenseDongleTools.GetInstance().GetDeviceType(toy.id);
                    }
                    thisConnected.isOn = true;
                }
            }
        }
    }

    private void OnErrorCodeResult(int code)
    {

        if (code == 99)
        {
            ShowError("haven no dongle.");
        }
        else if (code == 100)
        {
            ShowError("code:" + 100 + ",device init completed.");
        }
        else if (code == 200) 
        {
            //ShowError("code:" + result.code + ",Invalid Command.");
        }
        else if (code == 201) //
        {
        }
        else if (code == 202) //
        {
        }
        else if (code == 206) //ɨɹ
        {
        }
        else if (code == 400)
        {
            ShowError("code:" + code + ",the command is not support.");
        }
        else if (code == 401)
        {
            ShowError("code:" + code + ",the params is error.");
        }
        else if (code == 402)
        {
            ShowError("code:" + code + ",the json format is error");
        }
        else if (code == 403)
        {
            ShowError("code:" + code + ",the toy is not connected.");
        }
        else if (code == 404)
        {
            ShowError("code:" + code + ",the device is not not exists.");
        }
        else if (code == 406)
        {
            ShowError("code:" + code + ",it's full on max connectting times");
        }
        else if (code == 501)
        {
            ShowError("code:" + code + ",scanning now,part of command is not support");
        }
        else if (code == 505)
        {
            ShowError("code:" + code + ",other errors");
        }

    }

    public void InitCheck()
    {
        foreach (Transform child in selectRoot.transform)
        {
            Destroy(child.gameObject);
        }
        selectList.Clear();
        selectRoot.DetachChildren();
        if (thisToys != null)
        {
            foreach (LovenseDongleToy t in thisToys)
            {
                DongleToySelect newSelect = Instantiate(selectToy, selectRoot);
                selectList.Add(newSelect);
                newSelect.SetData(t);
                if (t.isConnected)
                {
                    //LovenseDongleTools.GetInstance().GetDeviceType(t.id);
                }
            }
        }
    }

    public List<string> GetCheckToys()
    {
        List<string> strList = new List<string>();
        if(thisToys.Count == 1)
        {
            strList.Add(thisToys[0].id);
        }
        for (int i = 0; i < selectList.Count; i++)
        {
            if (selectList[i].IsCheck())
            {
                strList.Add(selectList[i].GetData().id);
            }
        }
        return strList;
    }

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

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

    public void OnThisClickChange(bool isOn)
    {
        if (!isOn)
        {
            if (thisToys[0] != null && thisToys.Count == 1)
            {
                LovenseDongleTools.GetInstance().DisConnectToys(new List<string> { thisToys[0].id });
            }
            else
            {
                List<string> toys = GetCheckToys();
                LovenseDongleTools.GetInstance().DisConnectToys(toys);
            }
        }
        else
        {
            
                List<string> toys = GetCheckToys();
                LovenseDongleTools.GetInstance().ConnectToys(toys);
        }
    }


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

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

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

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

    public void OnStopClick()
    {
        if (thisToys != null && thisToys.Count == 1)
        {
            LovenseDongleTools.GetInstance().StopAll(new List<string>() { thisToys[0].id });
        } else
        {
            List<string> toys = GetCheckToys();
            LovenseDongleTools.GetInstance().StopAll(toys);
        }
    }

    public void ClickOnFeedback()
    {
        DongleGlobal.GetInstance().thisToys = thisToys;
        SceneManager.LoadScene("LovenseDongle2");
    }

    public void ClickOnBack()
    {
        SceneManager.LoadScene("LovenseDongle0");
    }


}
