using Lovense.UnityKit;
using Lovense.UnityKit.WinBle;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

public class WinLovenseDetailItem : MonoBehaviour
{
    // Start is called before the first frame update
    [SerializeField]
    public WinLovenseItem singleItem;
    [SerializeField]
    public WinbleToySelect selectObj;

    [SerializeField]
    public Transform selectRoot;
    [SerializeField]
    public GameObject detailPanel;
    [SerializeField]
    public GameObject supportDataReportingBtn;

    [SerializeField]
    public Text devicenfo, deviceMac, deviceVersion, deviceBattery, movement;

    [SerializeField]
    public Text connect;
    [SerializeField]
    public Image functionButton, patternButton, patternV2Button,presetButton;
    [SerializeField]
    public FunctionPanel functionPanel;
    [SerializeField]
    public PatternPanel patternPanel;
    [SerializeField]
    public PresetPanel presetPanel;
    [SerializeField]
    public PatternV2Panel patternV2Panel;


    private bool isConnect = true;


    public static OnConnectStatusChange onConnectStatusChange;

    [SerializeField]
    public SliderItem addPatternObj;
    [SerializeField]
    public Transform patternContent;

    private List<LovenseWinBleToy> thisToys;

    private void Awake()
    {
        LovenseWinBleTools.onConnectChangeEvent.AddListener(onToysConnect);
        LovenseWinBleTools.onGetToyDataReportingEnabled.AddListener(OnGetToyReportingEnabled);
    }


    void Start()
    {
        this.thisToys = WinbleGlobal.GetInstance().thisToys;
        onFunctionClick();
        if(this.thisToys != null && this.thisToys.Count == 1)
        {
            if (!LovenseWinBleTools.GetInstance().IsConnected(thisToys[0].id))
            {
                LovenseWinBleTools.GetInstance().ConnectToys(new List<string> { thisToys[0].id } );
                supportDataReportingBtn.SetActive(false);
            }
            else
            {
                if (thisToys[0].isSupportDataReporting)
                {
                    supportDataReportingBtn.SetActive(true);
                } else
                {
                    LovenseWinBleTools.GetInstance().CheckDataReportingEnable(thisToys[0].id);
                    supportDataReportingBtn.SetActive(false);
                }
            }
            if(LovenseWinBleTools.GetInstance().GetSupportCommandsByType(thisToys[0].typeName).Contains(LovenseCommandType.POSITION))
            {
                patternV2Button.gameObject.SetActive(true);
            } else
            {
                patternV2Button.gameObject.SetActive(false);
            }

            this.selectRoot.gameObject.SetActive(false);
            this.detailPanel.SetActive(true);
            singleItem.SetToys(thisToys[0]);
            singleItem.gameObject.SetActive(true);
        } else
        { 
                patternV2Button.gameObject.SetActive(false);
            List<string> temp = new List<string>();
            foreach(LovenseWinBleToy toy in thisToys)
            {
                temp.Add(toy.id);
                if (toy.isSupportDataReporting)
                {
                    supportDataReportingBtn.SetActive(true);
                }
            }
            LovenseWinBleTools.GetInstance().ConnectToys(temp);
            this.selectRoot.gameObject.SetActive(true);
            this.detailPanel.SetActive(false)   ;
            initSelectPanel();
        }
        
        
        if (!isConnect)
        {
            connect.text = "Connect";
        }
        else
        {
            connect.text = "DisConnect";
        }
    }

    private void OnDestroy()
    {
        LovenseWinBleTools.onConnectChangeEvent.RemoveListener(onToysConnect);
        LovenseWinBleTools.onGetToyDataReportingEnabled.RemoveListener(OnGetToyReportingEnabled);
    }

    public void OnGetToyReportingEnabled(string toyId)
    {
        if (thisToys != null)
        {
            foreach (LovenseWinBleToy toy in thisToys)
            {
                if (toy.id == toyId)
                {
                    toy.isSupportDataReporting = true;
                    supportDataReportingBtn.SetActive(true);
                }
            }
        }
    }

    private List<WinbleToySelect> selectList = new List<WinbleToySelect>();

    public void initSelectPanel()
    {
        selectList.Clear();
        foreach (LovenseWinBleToy toy in thisToys)
        {
            WinbleToySelect select = GameObject.Instantiate<WinbleToySelect>(selectObj, selectRoot);
            if(select != null)
            {
                select.SetData(toy.name, toy.id);
                selectList.Add(select);
            }
        }
    }

    public List<string> GetSelectedToys()
    {
        if(thisToys.Count == 1)
        {
            return new List<string>() { thisToys[0].id };
        }
        List<string> list = new List<string>();
        foreach(WinbleToySelect select in selectList)
        {
            if(select.IsOn())
            {
                list.Add(select.GetId());
            }
        }
        return list;
    }

    public void onToysConnect(string id,bool connected)
    {
        if(thisToys != null)
        {
            LovenseWinBleToy toy = thisToys.Find(t => t.id == id);
            if(toy != null )
            {
                if (connected)
                {
                    LovenseWinBleTools.GetInstance().CheckDataReportingEnable(toy.id);
                    LovenseWinBleTools.GetInstance().GetBattery(id);
                    //LovenseWinBleTools.GetInstance().SendFunctionWithoutValue(id, LovenseCommandType.GETTYPE);
                }
            }
        }
    }

    public void Back()
    {
        Scene currentScene = SceneManager.GetActiveScene();
        int previousSceneIndex = currentScene.buildIndex - 1;
        SceneManager.LoadScene("LovenseWinScene0");
    }

    public void onConnectClick()
    {
        if (connect.text == "DisConnect")
        {
            LovenseWinBleTools.GetInstance().DisconnectToys(GetSelectedToys());
            connect.text = "Connect";
        } else
        {
            LovenseWinBleTools.GetInstance().ConnectToys(GetSelectedToys());
            connect.text = "DisConnect";
        }
    }

    

    public void onFunctionClick()
    {
        //commandFunction.color = Color.gray;
        functionButton.color = Color.cyan;
        patternButton.color = Color.gray;
        presetButton.color = Color.gray;
        patternV2Button.color = Color.gray;

        functionPanel.gameObject.SetActive(true);
        functionPanel.SetGetToysCallback(GetSelectedToys);
        patternPanel.gameObject.SetActive(false);
        presetPanel.gameObject.SetActive(false);
        patternV2Panel.gameObject.SetActive(false);
    }

    public void onPatternClick()
    {
        functionButton.color = Color.gray;
        patternButton.color = Color.cyan;
        presetButton.color = Color.gray;
        patternV2Button.color = Color.gray;

        functionPanel.gameObject.SetActive(false);
        patternPanel.gameObject.SetActive(true);
        patternPanel.SetGetToysCallback(GetSelectedToys);
        presetPanel.gameObject.SetActive(false);
        patternV2Panel.gameObject.SetActive(false);
    }

    public void onPresetClick()
    {
        functionButton.color = Color.gray;
        patternButton.color = Color.gray;
        presetButton.color = Color.cyan;
        patternV2Button.color = Color.gray;

        functionPanel.gameObject.SetActive(false);
        patternPanel.gameObject.SetActive(false);
        presetPanel.gameObject.SetActive(true);
        patternV2Panel.gameObject.SetActive(false);
        presetPanel.SetGetToysCallback(GetSelectedToys);
    }

    public void onPatterV2Click()
    {
        functionButton.color = Color.gray;
        patternButton.color = Color.gray;
        presetButton.color = Color.gray;
        patternV2Button.color = Color.cyan;

        functionPanel.gameObject.SetActive(false);
        functionPanel.SetGetToysCallback(GetSelectedToys);
        patternPanel.gameObject.SetActive(false);
        presetPanel.gameObject.SetActive(false);
        patternV2Panel.gameObject.SetActive(true);
        patternV2Panel.SetGetToysCallback(GetSelectedToys);
    }

    public void onStopClick()
    {
        LovenseWinBleTools.GetInstance().StopAll(GetSelectedToys());
    }



   
   
   


    public class ConnectStatusChange
    {

        public string toyId { get; set; }
        public int status { get; set; }
    }
    [Serializable]
    public class OnConnectStatusChange : UnityEngine.Events.UnityEvent<ConnectStatusChange>
    { }


    public void ClickOnFeedback()
    {
        SceneManager.LoadScene("LovenseWinScene2");
    }





}
