using NRKernal;
using SC.XR.Unity.Module_InputSystem;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.XR;
using UnityEngine.XR.OpenXR.Input;

public class XRInputManager : MonoBehaviour
{
    public Transform left = null;
    public Transform right = null;
    public InputActionProperty inputEvent;
    public List<InputActionReference> listinput;
    int xy = 8;
    // Start is called before the first frame update
    void Start()
    {
        NRInput.AddDownListener(ControllerHandEnum.Right, ControllerButton.APP, () => {
            Debug.Log("ControllerButton.APP===>Down");
            API_GSXR_Module_InputSystem_KS.GSXR_KSRight.inputDataKS.inputKeys.InputDataAddKey(InputKeyCode.Enter, InputKeyState.DOWN);
        });
        NRInput.AddDownListener(ControllerHandEnum.Right, ControllerButton.BEGIN, () => {
            Debug.Log("ControllerButton.BEGIN===>Down");
            API_GSXR_Module_InputSystem_KS.GSXR_KSRight.inputDataKS.inputKeys.InputDataAddKey(InputKeyCode.Enter, InputKeyState.DOWN);
        });
        NRInput.AddDownListener(ControllerHandEnum.Right, ControllerButton.END, () => {
            Debug.Log("ControllerButton.END===>Down");
            API_GSXR_Module_InputSystem_KS.GSXR_KSRight.inputDataKS.inputKeys.InputDataAddKey(InputKeyCode.Enter, InputKeyState.DOWN);
        });
        NRInput.AddDownListener(ControllerHandEnum.Right, ControllerButton.GRIP, () => {
            Debug.Log("ControllerButton.GRIP===>Down");
            API_GSXR_Module_InputSystem_KS.GSXR_KSRight.inputDataKS.inputKeys.InputDataAddKey(InputKeyCode.Enter, InputKeyState.DOWN);
        });
        NRInput.AddDownListener(ControllerHandEnum.Right, ControllerButton.HOME, () => {
            Debug.Log("ControllerButton.HOME===>Down");
            API_GSXR_Module_InputSystem_KS.GSXR_KSRight.inputDataKS.inputKeys.InputDataAddKey(InputKeyCode.Enter, InputKeyState.DOWN);
        });
        NRInput.AddDownListener(ControllerHandEnum.Right, ControllerButton.TRIGGER, () => {
            Debug.Log("ControllerButton.TRIGGER===>Down");
            API_GSXR_Module_InputSystem_KS.GSXR_KSRight.inputDataKS.inputKeys.InputDataAddKey(InputKeyCode.Enter, InputKeyState.DOWN);
        });
        NRInput.AddDownListener(ControllerHandEnum.Right, ControllerButton.TOUCHPAD_BUTTON, () => {
            Debug.Log("ControllerButton.TOUCHPAD_BUTTON===>Down");
            API_GSXR_Module_InputSystem_KS.GSXR_KSRight.inputDataKS.inputKeys.InputDataAddKey(InputKeyCode.Enter, InputKeyState.DOWN);
        });
        
        NRInput.AddUpListener(ControllerHandEnum.Right, ControllerButton.APP, () => {
            Debug.Log("ControllerButton.APP===>UP");
            API_GSXR_Module_InputSystem_KS.GSXR_KSRight.inputDataKS.inputKeys.InputDataAddKey(InputKeyCode.Enter, InputKeyState.UP);
        });
        NRInput.AddUpListener(ControllerHandEnum.Right, ControllerButton.BEGIN, () => {
            Debug.Log("ControllerButton.BEGIN===>UP");
            API_GSXR_Module_InputSystem_KS.GSXR_KSRight.inputDataKS.inputKeys.InputDataAddKey(InputKeyCode.Enter, InputKeyState.UP);
        });
        NRInput.AddUpListener(ControllerHandEnum.Right, ControllerButton.END, () => {
            Debug.Log("ControllerButton.END===>UP");
            API_GSXR_Module_InputSystem_KS.GSXR_KSRight.inputDataKS.inputKeys.InputDataAddKey(InputKeyCode.Enter, InputKeyState.UP);
        });
        NRInput.AddUpListener(ControllerHandEnum.Right, ControllerButton.GRIP, () => {
            Debug.Log("ControllerButton.GRIP===>UP");
            API_GSXR_Module_InputSystem_KS.GSXR_KSRight.inputDataKS.inputKeys.InputDataAddKey(InputKeyCode.Enter, InputKeyState.UP);
        });
        NRInput.AddUpListener(ControllerHandEnum.Right, ControllerButton.HOME, () => {
            Debug.Log("ControllerButton.HOME===>UP");
            API_GSXR_Module_InputSystem_KS.GSXR_KSRight.inputDataKS.inputKeys.InputDataAddKey(InputKeyCode.Enter, InputKeyState.UP);
        });
        NRInput.AddUpListener(ControllerHandEnum.Right, ControllerButton.TRIGGER, () => {
            Debug.Log("ControllerButton.HOME===>TRIGGER");
            API_GSXR_Module_InputSystem_KS.GSXR_KSRight.inputDataKS.inputKeys.InputDataAddKey(InputKeyCode.Enter, InputKeyState.UP);
        });
        NRInput.AddUpListener(ControllerHandEnum.Right, ControllerButton.TOUCHPAD_BUTTON, () => {
            Debug.Log("ControllerButton.HOME===>TOUCHPAD_BUTTON");
            API_GSXR_Module_InputSystem_KS.GSXR_KSRight.inputDataKS.inputKeys.InputDataAddKey(InputKeyCode.Enter, InputKeyState.UP);
        });

        Invoke("startXR", 1f);
        /*
        return;
        for (int i = 0; i < 15; i++)
        {
            listinput[i].action.Enable();
            listinput[i].action.performed += OnEventL;
            listinput[i].action.canceled += OnCanceledEventL;
        }
        for (int i = 15; i < listinput.Count; i++)
        {
            listinput[i].action.Enable();
            listinput[i].action.performed += OnEventR;
            listinput[i].action.canceled += OnCanceledEventR;
        }
        InputDevices.deviceConnected += onDeviceConnected;
        InputDevices.deviceDisconnected += onDeviceDisConnected;
        Invoke("startXR", 1f);*/
    }

    private void downTP()
    {
    }

    List<Vector3> leftInfo = new List<Vector3>();
    List<Vector3> rightInfo = new List<Vector3>();
    void startXR()
    {
#if UNITY_EDITOR

        Module_InputSystem.instance.SetActiveInputDevice(InputDeviceType.KS, false);
        Module_InputSystem.instance.SetActiveInputDevice(InputDeviceType.Head, true);
#else

                  Module_InputSystem.instance.SetActiveInputDevice(InputDeviceType.KS, true);
                  Module_InputSystem.instance.SetActiveInputDevice(InputDeviceType.Head, false);
#endif
        /*
        left.gameObject.SetActive(false);
        right.gameObject.SetActive(false);
        List<UnityEngine.XR.InputDevice> inputDevices = new List<UnityEngine.XR.InputDevice>();
        InputDevices.GetDevices(inputDevices);
        for (int i = 0; i < inputDevices.Count; i++)
        {
            onDeviceConnected(inputDevices[i]);
        }*/
    }
    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.X))
        {
            API_GSXR_Module_InputSystem_KS.GSXR_KSLeft.inputDataKS.inputKeys.InputDataAddKey(InputKeyCode.X, InputKeyState.DOWN);
        }
        if (Input.GetKeyUp(KeyCode.X))
        {
            API_GSXR_Module_InputSystem_KS.GSXR_KSLeft.inputDataKS.inputKeys.InputDataAddKey(InputKeyCode.X, InputKeyState.UP);
        }
    }
    private void onDeviceDisConnected(UnityEngine.XR.InputDevice obj)
    {
        if (obj.characteristics.ToString().Contains(InputDeviceCharacteristics.Left.ToString()))
        {
            Debug.Log("Left===>" + obj.isValid);
            left.gameObject.SetActive(obj.isValid);
        }

        if (obj.characteristics.ToString().Contains(InputDeviceCharacteristics.Right.ToString()))
        {
            Debug.Log("Right===>" + obj.isValid);
            right.gameObject.SetActive(obj.isValid);
        }
    }

    private void OnApplicationPause(bool pause)
    {
        if (!pause)
        {
            List<UnityEngine.XR.InputDevice> inputDevices = new List<UnityEngine.XR.InputDevice>();
            InputDevices.GetDevices(inputDevices);
            for (int i = 0; i < inputDevices.Count; i++)
            {
                onDeviceConnected(inputDevices[i]);
            }
        }
    }

    private void onDeviceConnected(UnityEngine.XR.InputDevice obj)
    {
        if (obj.characteristics.ToString().Contains(InputDeviceCharacteristics.Left.ToString()))
        {
            Debug.Log("Left===>" + obj.isValid);
            left.gameObject.SetActive(obj.isValid);
        }

        if (obj.characteristics.ToString().Contains(InputDeviceCharacteristics.Right.ToString()))
        {
            Debug.Log("Right===>" + obj.isValid);
            right.gameObject.SetActive(obj.isValid);
        }

    }
    private void OnCanceledEventL(InputAction.CallbackContext context)
    {
        Debug.Log("OnCanceledEventL" + context.control.name);
        switch (context.control.name)
        {
            case "secondarytouched":
                break;
            case "secondarybutton":
                API_GSXR_Module_InputSystem_KS.GSXR_KSLeft.inputDataKS.inputKeys.InputDataAddKey(InputKeyCode.Y, InputKeyState.UP);

                break;
            case "primarytouched":
                break;
            case "primarybutton":
                Debug.Log("InputKeyCode.A===��UP");
                API_GSXR_Module_InputSystem_KS.GSXR_KSLeft.inputDataKS.inputKeys.InputDataAddKey(InputKeyCode.X, InputKeyState.UP);
                API_GSXR_Module_InputSystem_KS.GSXR_KSLeft.inputDataKS.inputKeys.InputDataAddKey(InputKeyCode.Enter, InputKeyState.UP);

                break;
            case "touchpadtouched":
                break;
            case "thumbstickclicked":
                break;
            case "thumbstick":
                API_GSXR_Module_InputSystem_KS.GSXR_KSLeft.inputDataKS.JoystickX = xy + (int)(context.ReadValue<Vector2>().x * 10);
                API_GSXR_Module_InputSystem_KS.GSXR_KSLeft.inputDataKS.JoystickY = xy + (int)(context.ReadValue<Vector2>().y * 10);

                break;
            case "grip":
                API_GSXR_Module_InputSystem_KS.GSXR_KSLeft.inputDataKS.HallInside = 10 - (int)((context.ReadValue<float>()) * 10f);

                break;
            case "grippressed":
                API_GSXR_Module_InputSystem_KS.GSXR_KSLeft.inputDataKS.inputKeys.InputDataAddKey(InputKeyCode.LHallInside, InputKeyState.UP);

                break;
            case "trigger":
                API_GSXR_Module_InputSystem_KS.GSXR_KSLeft.inputDataKS.HallFoward = 10 - (int)((context.ReadValue<float>()) * 10f);

                break;
            case "menu":
                Module_InputSystem.instance.SetActiveInputDevice(InputDeviceType.KS, true);
                Module_InputSystem.instance.SetActiveInputDevice(InputDeviceType.Head, false);
                API_GSXR_Module_InputSystem_KS.GSXR_KSLeft.inputDataKS.inputKeys.InputDataAddKey(InputKeyCode.LFunction, InputKeyState.UP);
                break;
        }
    }
    void OnEventL(InputAction.CallbackContext context)
    {
        Debug.Log("OnEventL" + context.control.name);
        switch (context.control.name)
        {
            case "secondarytouched":
                break;
            case "secondarybutton":
                API_GSXR_Module_InputSystem_KS.GSXR_KSLeft.inputDataKS.inputKeys.InputDataAddKey(InputKeyCode.Y, InputKeyState.DOWN);

                break;
            case "primarytouched":
                break;
            case "primarybutton":
                Debug.Log("InputKeyCode.A===��DOWN");
                API_GSXR_Module_InputSystem_KS.GSXR_KSLeft.inputDataKS.inputKeys.InputDataAddKey(InputKeyCode.X, InputKeyState.DOWN);

                API_GSXR_Module_InputSystem_KS.GSXR_KSLeft.inputDataKS.inputKeys.InputDataAddKey(InputKeyCode.Enter, InputKeyState.DOWN);

                break;
            case "touchpadtouched":
                break;
            case "thumbstickclicked":
                break;
            case "thumbstick":
                API_GSXR_Module_InputSystem_KS.GSXR_KSLeft.inputDataKS.JoystickX = xy + (int)(context.ReadValue<Vector2>().x * 10);
                API_GSXR_Module_InputSystem_KS.GSXR_KSLeft.inputDataKS.JoystickY = xy + (int)(context.ReadValue<Vector2>().y * 10);

                break;
            case "grip":
                API_GSXR_Module_InputSystem_KS.GSXR_KSLeft.inputDataKS.HallInside = 10 - (int)((context.ReadValue<float>()) * 10f);

                break;
            case "grippressed":
                API_GSXR_Module_InputSystem_KS.GSXR_KSLeft.inputDataKS.inputKeys.InputDataAddKey(InputKeyCode.LHallInside, InputKeyState.DOWN);

                break;
            case "trigger":
                API_GSXR_Module_InputSystem_KS.GSXR_KSLeft.inputDataKS.HallFoward = 10 - (int)((context.ReadValue<float>()) * 10f);

                break;
            case "menu":
                API_GSXR_Module_InputSystem_KS.GSXR_KSLeft.inputDataKS.inputKeys.InputDataAddKey(InputKeyCode.LFunction, InputKeyState.DOWN);
                break;

        }
    }

    private void OnCanceledEventR(InputAction.CallbackContext context)
    {
        Debug.Log("OnCanceledEventR" + context.control.name);
        switch (context.control.name)
        {
            case "secondarytouched":
                break;
            case "secondarybutton":
                API_GSXR_Module_InputSystem_KS.GSXR_KSRight.inputDataKS.inputKeys.InputDataAddKey(InputKeyCode.B, InputKeyState.UP);

                break;
            case "primarytouched":
                break;
            case "primarybutton":
                API_GSXR_Module_InputSystem_KS.GSXR_KSRight.inputDataKS.inputKeys.InputDataAddKey(InputKeyCode.A, InputKeyState.UP);
                API_GSXR_Module_InputSystem_KS.GSXR_KSRight.inputDataKS.inputKeys.InputDataAddKey(InputKeyCode.Enter, InputKeyState.UP);

                break;
            case "touchpadtouched":
                break;
            case "thumbstickclicked":
                break;
            case "thumbstick":
                API_GSXR_Module_InputSystem_KS.GSXR_KSRight.inputDataKS.JoystickX = xy + (int)(context.ReadValue<Vector2>().x * 10);
                API_GSXR_Module_InputSystem_KS.GSXR_KSRight.inputDataKS.JoystickY = xy + (int)(context.ReadValue<Vector2>().y * 10);

                break;
            case "grip":
                API_GSXR_Module_InputSystem_KS.GSXR_KSRight.inputDataKS.HallInside = 10 - (int)((context.ReadValue<float>()) * 10f);

                break;
            case "grippressed":
                API_GSXR_Module_InputSystem_KS.GSXR_KSRight.inputDataKS.inputKeys.InputDataAddKey(InputKeyCode.RHallInside, InputKeyState.UP);

                break;
            case "trigger":
                API_GSXR_Module_InputSystem_KS.GSXR_KSRight.inputDataKS.HallFoward = 10 - (int)((context.ReadValue<float>()) * 10f);

                break;
            case "menu":
                API_GSXR_Module_InputSystem_KS.GSXR_KSRight.inputDataKS.inputKeys.InputDataAddKey(InputKeyCode.RFunction, InputKeyState.UP);

                break;
        }
    }
    void OnEventR(InputAction.CallbackContext context)
    {
        Debug.Log("OnEventR" + context.control.name);
        switch (context.control.name)
        {
            case "secondarytouched":
                break;
            case "secondarybutton":
                API_GSXR_Module_InputSystem_KS.GSXR_KSRight.inputDataKS.inputKeys.InputDataAddKey(InputKeyCode.B, InputKeyState.DOWN);

                break;
            case "primarytouched":
                break;
            case "primarybutton":
                API_GSXR_Module_InputSystem_KS.GSXR_KSRight.inputDataKS.inputKeys.InputDataAddKey(InputKeyCode.A, InputKeyState.DOWN);
                API_GSXR_Module_InputSystem_KS.GSXR_KSRight.inputDataKS.inputKeys.InputDataAddKey(InputKeyCode.Enter, InputKeyState.DOWN);

                break;
            case "touchpadtouched":
                break;
            case "thumbstickclicked":
                break;
            case "thumbstick":
                API_GSXR_Module_InputSystem_KS.GSXR_KSRight.inputDataKS.JoystickX = xy + (int)(context.ReadValue<Vector2>().x * 10);
                API_GSXR_Module_InputSystem_KS.GSXR_KSRight.inputDataKS.JoystickY = xy + (int)(context.ReadValue<Vector2>().y * 10);

                break;
            case "grip":
                API_GSXR_Module_InputSystem_KS.GSXR_KSRight.inputDataKS.HallInside = 10 - (int)((context.ReadValue<float>()) * 10f);

                break;
            case "grippressed":
                API_GSXR_Module_InputSystem_KS.GSXR_KSRight.inputDataKS.inputKeys.InputDataAddKey(InputKeyCode.RHallInside, InputKeyState.DOWN);

                break;
            case "trigger":
                API_GSXR_Module_InputSystem_KS.GSXR_KSRight.inputDataKS.HallFoward = 10 - (int)((context.ReadValue<float>()) * 10f);

                break;
            case "menu":
                Module_InputSystem.instance.SetActiveInputDevice(InputDeviceType.KS, true);
                Module_InputSystem.instance.SetActiveInputDevice(InputDeviceType.Head, false);
                API_GSXR_Module_InputSystem_KS.GSXR_KSRight.inputDataKS.inputKeys.InputDataAddKey(InputKeyCode.RFunction, InputKeyState.DOWN);

                break;

        }
    }

    // Debug.Log("OnEvent=name==>" + context.control.name);
    /*
    Debug.Log("OnEvent=layout==>" + context.control.layout);
    Debug.Log("OnEvent=noisy==>" + context.control.noisy);
    Debug.Log("OnEvent=path==>" + context.control.path);
    Debug.Log("OnEvent=shortDisplayName==>" + context.control.shortDisplayName);
    Debug.Log("OnEvent=synthetic==>" + context.control.synthetic);
    Debug.Log("OnEvent=valueSizeInBytes==>" + context.control.valueSizeInBytes);
    Debug.Log("OnEvent=valueType==>" + context.control.valueType.Name);
    Debug.Log("OnEvent=variants==>" + context.control.variants);
    Debug.Log("OnEvent=variants==>" + context.control.EvaluateMagnitude());*/
}