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

public class AndroidLovenseDetailItem : MonoBehaviour
{
    // Start is called before the first frame update
    [SerializeField]
    public GameObject toyDetails, toysNames;

    [SerializeField]
    public Text deviceType, deviceMac, deviceVersion, deviceBattery;

    

    [SerializeField]
    public Text connect;

    [SerializeField]
    public Image  functionButton, patternButton, presetButton;

    [SerializeField]
    public FunctionPanel functionPanel;
    [SerializeField]
    public PatternPanel patternPanel;
    [SerializeField]
    public PresetPanel presetPanel;


    List<LovenseAndroidToy> toys;

    public List<AndroidToyCheckItem> checkItems = new List<AndroidToyCheckItem>();
    [SerializeField]
    public AndroidToyCheckItem itemObject;

    [SerializeField]
    public Transform toysRoot;

    private void Awake()
    {
        LovenseAndroidSDK.GetInstance().SubscribeConnectionChangedEvent(OnConnectFunc);
        LovenseAndroidSDK.GetInstance().SubscribeBatteryChangedEvent(OnGetBattery);
        LovenseAndroidSDK.GetInstance().SubscribeCommandResultEvent(OnCommandResult);
        LovenseAndroidSDK.GetInstance().SubscribeDeviceInfoGotEvent(OnGetTypeInfo);
    }

    

    void Start()
    {
        this.toys = AndroidGlobalParams.GetInstance().thisToys;
        functionPanel.SetGetToysCallback(GetToys);
        presetPanel.SetGetToysCallback(GetToys);
        patternPanel.SetGetToysCallback(GetToys);
        ClickOnFunction();
        if(this.toys != null && this.toys.Count == 1)
        {
            toysNames.gameObject.SetActive(false);
            toyDetails.gameObject.SetActive(true);
            LovenseAndroidSDK.GetInstance().AddBatteryListener(toys[0].toyId);
            LovenseAndroidSDK.GetInstance().AddDeviceTypeListener(toys[0].toyId);
            LovenseAndroidSDK.GetInstance().AddCommandResultListener(toys[0].toyId);
            
            if (!LovenseAndroidSDK.GetInstance().IsConnected(this.toys[0].toyId))
            {
                connect.text = "Connect";
                LovenseAndroidSDK.GetInstance().ConnectToys(this.toys[0].toyId);
            }
            else
            {
                connect.text = "DisConnect";
                if (string.IsNullOrEmpty(this.toys[0].type))
                {
                    LovenseAndroidSDK.GetInstance().SendCommandWithoutValue(this.toys[0].toyId, LovenseCommandType.GET_DEVICEINFO);
                }
                LovenseAndroidSDK.GetInstance().SendCommandWithoutValue(this.toys[0].toyId, LovenseCommandType.GET_BATTERY);
            }
            deviceType.text = this.toys[0].type;
            deviceMac.text = this.toys[0].macAddress;
            deviceVersion.text = this.toys[0].version + "";
            deviceBattery.text = this.toys[0].battery + "%";
        } else
        {
            connect.text = "Connect";
            InitToys();
            toysNames.gameObject.SetActive(true);
            toyDetails.gameObject.SetActive(false);
        }
    }


    public void InitToys()
    {
        for(int i = 0; i < this.toys.Count;i ++)
        {
            AndroidToyCheckItem newObject = GameObject.Instantiate(itemObject, toysRoot);
            if (newObject != null)
            {
                newObject.gameObject.SetActive(true);
                newObject.SetCheckData(toys[i].deviceName, toys[i].toyId);
                checkItems.Add(newObject);
            }
            else
            {
            }
        }
    }

    public void OnConnectFunc(string toyId, ToyStatus status)
    {
        switch (status)
        {
            case ToyStatus.CONNECTING:
                break;
            case ToyStatus.CONNECTED:
                connect.text = "DisConnect";
                int index = this.toys.FindIndex(t => t.toyId == toyId);
                if(index != -1)
                {
                    this.toys[index].connected = true;
                    if(string.IsNullOrEmpty(this.toys[index].toyVersion))
                    {
                        LovenseAndroidSDK.GetInstance().SendCommandWithoutValue(toyId, LovenseCommandType.GET_DEVICEINFO);
                    }
                    LovenseAndroidSDK.GetInstance().SendCommandWithoutValue(toyId, LovenseCommandType.GET_BATTERY);
                } 
                break;
            case ToyStatus.DISCONNECT:
            case ToyStatus.DISCOVERED:
                connect.text = "Connect";
                int idx = this.toys.FindIndex(t => t.toyId == toyId);
                if (idx != -1)
                {
                    this.toys[idx].connected = false;
                }
                break;
        }
    }

    private void OnGetTypeInfo(string toyId, DeviceTypeUpdateInfo info)
    {
        if (this.toys != null && this.toys.Count == 1 && this.toys[0].toyId == toyId)
        {
            deviceType.text = this.toys[0].type+info.toyVersion;
            int index = this.toys.FindIndex(t => t.toyId == toyId);
            this.toys[0].macAddress = info.macAddress;
            this.toys[0].version = info.version;
            }
    }
    public void OnCommandResult(CommandResultType type, object obj)
    {
        if (type == CommandResultType.SUCCESS)
        {
            Debug.Log("Send command success,messsage:" + obj);
        }
        else {
            CommandErrorData data = (CommandErrorData)obj;
            Debug.LogError("Send command error,toyId:"+data.toyId+",code:"+ data.code+",message:"+data.message);
        }
    }

    public void OnGetBattery(string toyId, int battery)
    {
        if (this.toys.Count == 1 && toyId == this.toys[0].toyId)
        {
            deviceBattery.text = battery + "%";
        }
    }
    // Update is called once per frame
    void Update()
    {

    }


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

    public void ClickOnConnect()
    {
        if(this.toys.Count == 1)
        {
            if (connect.text == "Connect")
            {
                    LovenseAndroidSDK.GetInstance().ConnectToys(this.toys[0].toyId);
            }
            else
            {
                LovenseAndroidSDK.GetInstance().DisConnectToy(this.toys[0].toyId);
            }
            return;
        }
        List<string> ids = new List<string>();
        for(int i=0;i < checkItems.Count;i++)
        {
            if(checkItems[i].IsCheck())
            {
                ids.Add(checkItems[i].GetToyId());
            }
        }
        if(ids.Count == 0 )
        {
            LovenseAndroidSDK.GetInstance().ShowToast("please select toys");
            return;
        }
        if(connect.text == "Connect")
        {
            LovenseAndroidSDK.GetInstance().ConnectToys(ids);
            connect.text = "DisConnect";
        } else
        {
            LovenseAndroidSDK.GetInstance().DisConnectToy(ids.ToArray());
            connect.text = "Connect"; 
        }
    }

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

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

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

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

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

        //commandPanel.SetActive(false);
        functionPanel.gameObject.SetActive(false);
        patternPanel.gameObject.SetActive(false);
        presetPanel.gameObject.SetActive(true);
    }

   
    public void ClickOnStop()
    {
        if(toys.Count == 1)
        {
            LovenseAndroidSDK.GetInstance().StopAll(toys[0].toyId);
            return;
        }
        List<string> ids = new List<string>();
        for (int i = 0; i < checkItems.Count; i++)
        {
            if (checkItems[i].IsCheck())
            {
                ids.Add(checkItems[i].GetToyId());
            }
        }
        if (ids.Count == 0)
        {
            LovenseAndroidSDK.GetInstance().ShowToast("please select toys");
            return;
        }
        LovenseAndroidSDK.GetInstance().StopAll(ids.ToArray());
    }

    public List<string> GetToys()
    {
        List<string> ids = new List<string>();
        if(this.toys.Count == 1 )
        {
            ids.Add(this.toys[0].toyId);
            return ids;
        }
        for (int i = 0; i < checkItems.Count; i++)
        {
            if (checkItems[i].IsCheck())
            {
                ids.Add(checkItems[i].GetToyId());
            }
        }
        return ids;
    }
   
    private void OnDestroy()
    {
        LovenseAndroidSDK.GetInstance().UnsubscribeConnectionChangedEvent(OnConnectFunc);
        LovenseAndroidSDK.GetInstance().UnsubscribeBatteryChangedEvent(OnGetBattery);
        LovenseAndroidSDK.GetInstance().UnsubscribeCommandResultEvent(OnCommandResult);
    }
}
