using System;
using System.IO.Ports;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class COMPortSelector_tags : MonoBehaviour
{
    public Dropdown comPortDropdown;
    public Button startButton;

    [SerializeField]
    private Button debugButton;

    [SerializeField]
    private GameObject sphere;

    [SerializeField]
    private GameObject sphere_colliding;

    [SerializeField]
    private Slider minSlider;

    [SerializeField]
    private Slider maxSlider;

    public Text feedbackText;
    public espwrite_inverse_tags espWriteScript;

    private List<string> availablePorts;
    private string selectedPort;
    private bool isDebugMode = false;  // Debug mode flag

    void Start()
    {
        availablePorts = new List<string>(SerialPort.GetPortNames());
        PopulateDropdown();

        sphere.SetActive(false);
        sphere_colliding.SetActive(false);

        startButton.onClick.AddListener(OnStartButtonPressed);
        minSlider.onValueChanged.AddListener(OnSliderMinValueChanged);
        maxSlider.onValueChanged.AddListener(OnSliderMaxValueChanged);

        maxSlider.value = maxSlider.maxValue;

        debugButton.onClick.AddListener(OnDebugButtonPressed);

        feedbackText.text = "Select a COM port and press Start.";
    }

    private void PopulateDropdown()
    {
        comPortDropdown.ClearOptions();
        if (availablePorts.Count > 0)
        {
            comPortDropdown.AddOptions(availablePorts);
            selectedPort = availablePorts[0];
            comPortDropdown.onValueChanged.AddListener(delegate { OnDropdownValueChanged(); });
        }
        else
        {
            comPortDropdown.AddOptions(new List<string> { "No COM ports found" });
            feedbackText.text = "No COM ports available.";
            startButton.interactable = false;
        }
    }

    private void OnSliderMinValueChanged(float value)
    {

         // Ensure minSlider's value doesn't exceed maxSlider's value
        if (value >= maxSlider.value)
        {
            minSlider.value = maxSlider.value - 1;  // Keep min less than max
        }

        if (espWriteScript != null)
        {
            espWriteScript.UpdateThimbleMin(value);
        }
    }

    private void OnSliderMaxValueChanged(float value)
    {
         // Ensure maxSlider's value doesn't go below minSlider's value
        if (value <= minSlider.value)
        {
            maxSlider.value = minSlider.value + 1;  // Keep max greater than min
        }

        if (espWriteScript != null)
        {
            espWriteScript.UpdateThimbleMax(value); 
        }
    }

    private void OnDropdownValueChanged()
    {
        selectedPort = availablePorts[comPortDropdown.value];
        feedbackText.text = "Selected port: " + selectedPort;
    }

    private void OnStartButtonPressed()
    {
        isDebugMode = false;
        espWriteScript.SetDebugMode(isDebugMode);  // Disable debug mode
        espWriteScript.enabled = true;

        if (!string.IsNullOrEmpty(selectedPort))
        {
            feedbackText.text = "Starting communication on port: " + selectedPort;
            espWriteScript.SetCOMPort(selectedPort);
        }
        else
        {
            feedbackText.text = "Please select a COM port.";
        }

        comPortDropdown.gameObject.SetActive(false);
        startButton.gameObject.SetActive(false);
        sphere.SetActive(true);
        sphere_colliding.SetActive(true);
    }

    private void OnDebugButtonPressed()
    {
        isDebugMode = true;
        espWriteScript.SetDebugMode(isDebugMode);  // Enable debug mode
        espWriteScript.enabled = true;

        comPortDropdown.gameObject.SetActive(false);
        startButton.gameObject.SetActive(false);
        sphere.SetActive(true);
        sphere_colliding.SetActive(true);
        feedbackText.text = "Debug mode activated.";
    }

    public void Reset()
    {
        espWriteScript.enabled = false;
        comPortDropdown.gameObject.SetActive(true);
        startButton.gameObject.SetActive(true);
        sphere.SetActive(false);
        sphere_colliding.SetActive(false);
        feedbackText.text = "Select a COM port and press Start.";
    }

    void Update()
    {
        if (!espWriteScript.IsPortOpen() && !isDebugMode)
        {
            Reset();
        }

        if (Input.GetKeyDown(KeyCode.Escape))
        {
            Application.Quit();
        }

        if (Input.GetKeyDown(KeyCode.R))
        {
            Reset();
        }
    }
}
