using Assets.Scripts.Devices.Ant;
using System.Collections;
using System.Collections.Generic;
using System;
using System.Linq;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
using Assets.Scripts.Devices.Ant.Interfaces;

public class ConnectDeviceModal : PFUIPanel
{
    private float timer = 1.0f;
    private SensorType mSensorType = SensorType.None;
    public SensorType SensorType { 
        get {
            return mSensorType;
        } 
        set
        {
            Debug.Log(value);
            mSensorType = value;
            Logo.sprite = Resources.Load<Sprite>("Images/Devices/Trainer_3");
        }
    }
    private Image Logo;
    private UnityEngine.Object deviceItem;
    private VerticalLayoutGroup content;

    protected override void Awake()
    {
        base.Awake();

        deviceList = new Dictionary<ushort, DeviceItem>();
        var closeBtn = this.transform.Find("CloseBtn");
        Logo = this.transform.Find("Logo").GetComponent<Image>();
        content = this.transform.Find("Panel").Find("Scroll View").Find("Viewport").Find("Content").GetComponent<VerticalLayoutGroup>();
        
        UIManager.AddEvent(closeBtn.gameObject, EventTriggerType.PointerClick, new UnityEngine.Events.UnityAction<BaseEventData>(e =>
        {
            //this.gameObject.SetActive(false);
            this.Close();
        }));

        deviceItem = Resources.Load("UI/Prefab/Device/DeviceItem");

    }

    // Start is called before the first frame update
    void Start()
    {
        SearchDevice();
    }

    private Dictionary<ushort, DeviceItem> deviceList;
    // Update is called once per frame
    void Update()
    {
        timer -= Time.deltaTime;
        if(timer <= 0)
        {
            SearchDevice();
            timer = 1.0f;
        }
    }

    private void SearchDevice()
    {
        if (SensorType != SensorType.None)
        {
            //Debug.Log(AntConnector.Instance().discoveredDevices.Count(d => d.Sensor == SensorType));

            var devices = new List<AbstractAntDevice>();
            switch (SensorType)
            {
                case SensorType.Cadence:
                    devices = AntConnector.Instance().discoveredDevices.Where(d => d.Sensor == SensorType || (d is ICadenceDevice && d.State == DeviceState.Connected)).OrderBy(d=>d.Priority).ToList();
                    break;
                case SensorType.HeartRate:
                    devices = AntConnector.Instance().discoveredDevices.Where(d => d.Sensor == SensorType || (d is IHeartRateDevice && d.State == DeviceState.Connected)).OrderBy(d => d.Priority).ToList();
                    break;
                case SensorType.Power:
                    devices = AntConnector.Instance().discoveredDevices.Where(d => d.Sensor == SensorType || (d is IPowerDevice && d.State == DeviceState.Connected)).OrderBy(d=>d.Priority).ToList();
                    break;
                case SensorType.Speed:
                    break;
                case SensorType.SpeedCadence:
                    devices = AntConnector.Instance().discoveredDevices.Where(d => d.Sensor == SensorType || (d is ISpeedDevice && d.State == DeviceState.Connected)).OrderBy(d => d.Priority).ToList();
                    break;
                case SensorType.Trainer:
                    devices = AntConnector.Instance().discoveredDevices.Where(d => d.Sensor == SensorType).ToList();
                    break;
                case SensorType.VirtualPower:
                    break;
            }

            foreach (var device in devices)
            {
                if (deviceList.ContainsKey(device.DeviceNumber))
                {
                    continue;
                }                

                var gameObject = (GameObject)Instantiate(deviceItem);
                gameObject.transform.SetParent(content.transform);
                var deviceItemObj = gameObject.GetComponent<DeviceItem>();
                deviceItemObj.DeviceInfo = device;

                UIManager.AddEvent(deviceItemObj.gameObject, EventTriggerType.PointerClick, new UnityEngine.Events.UnityAction<BaseEventData>(e =>
                {
                    //deviceItemObj.Select();
                    if(deviceItemObj.DeviceInfo.Sensor == SensorType)
                    {
                        deviceItemObj.DeviceInfo.Connect();
                    }
                    deviceItemObj.Set(true);
                    foreach (var item in deviceList)
                    {
                        if(item.Key != deviceItemObj.DeviceInfo.DeviceNumber)
                        {
                            item.Value.Set(false);
                            if(item.Value.DeviceInfo.Sensor == SensorType)
                            {
                                item.Value.DeviceInfo.Disconnect();
                            }
                        }
                    }
                    Close();
                }));
                //UIManager.AddEvent(deviceItemObj.gameObject, EventTriggerType.Deselect, new UnityEngine.Events.UnityAction<BaseEventData>(e =>
                //{
                //    //Debug.Log("de select");
                //    if(deviceItemObj.DeviceInfo.Sensor == SensorType)
                //    {
                //        deviceItemObj.DeviceInfo.Disconnect();
                //    }
                //}));

                deviceList.Add(device.DeviceNumber, deviceItemObj);
            }

            var firstDevice = deviceList.Select(d => d.Value).Where(d => d.DeviceInfo.State == DeviceState.Connected).OrderByDescending(d => d.DeviceInfo.Priority).FirstOrDefault();
            if(firstDevice != null)
            {
                firstDevice.Set(true);
            }
        }   
    }
}
