using System.Collections;
using System.Collections.Generic;
using TMPro;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

public class ConfiguratorUI : MonoBehaviour
{
    [SerializeField] TMP_Text headline;
    [SerializeField] Toggle toneToggle;
    [SerializeField] Toggle pianoToggle;
    [SerializeField] Toggle bassToggle;
    [SerializeField] Toggle chimeToggle;
    [SerializeField] Toggle colourToggle;
    [SerializeField] Toggle use2AFCToggle;
    [SerializeField] Slider loMassSlider;
    [SerializeField] Slider hiMassSlider;
    [SerializeField] Slider loSizeSlider;
    [SerializeField] Slider hiSizeSlider;
    [SerializeField] Slider numTrialsSlider;
    [SerializeField] TMP_Text loMassValue;
    [SerializeField] TMP_Text hiMassValue;
    [SerializeField] TMP_Text loSizeValue;
    [SerializeField] TMP_Text hiSizeValue;
    [SerializeField] TMP_Text numTrialsValue;

    [SerializeField] float VALUE_SCALE = 0.25f;
    [SerializeField] int TRIALS_SCALE = 10;

    bool syncing = false;

    // Start is called before the first frame update
    void Start()
    {
        Configurator.config.NewExperimentName();
        SyncUI();
    }

    // make sure UI elements reflect config state
    void SyncUI()
    {
        syncing = true;

        loMassSlider.value = Mathf.RoundToInt(Configurator.config.mass_lo / VALUE_SCALE);
        hiMassSlider.value = Mathf.RoundToInt(Configurator.config.mass_hi / VALUE_SCALE);

        loSizeSlider.value = Mathf.RoundToInt(Configurator.config.size_lo / VALUE_SCALE);
        hiSizeSlider.value = Mathf.RoundToInt(Configurator.config.size_hi / VALUE_SCALE);

        numTrialsSlider.value = Mathf.RoundToInt(Configurator.config.num_trials / TRIALS_SCALE);

        headline.text = $"Experiment Settings [{Configurator.config.experiment}]";

        toneToggle.isOn = Configurator.config.useTones;
        bassToggle.isOn = Configurator.config.useBass;
        chimeToggle.isOn = Configurator.config.useChimes;
        pianoToggle.isOn = Configurator.config.usePiano;

        use2AFCToggle.isOn = Configurator.config.use2AFC;

        colourToggle.isOn = Configurator.config.useColours;

        syncing = false;
    }

    public void loMassChanged ()
    {
        Configurator.config.mass_lo = VALUE_SCALE * loMassSlider.value;
        loMassValue.text = $"{Configurator.config.mass_lo:0.00}";

        if ( !syncing && loMassSlider.value > hiMassSlider.value )
        {
            hiMassSlider.value = loMassSlider.value;
        }
    }

    public void hiMassChanged ()
    {
        Configurator.config.mass_hi = VALUE_SCALE * hiMassSlider.value;
        hiMassValue.text = $"{Configurator.config.mass_hi:0.00}";

        if ( !syncing && loMassSlider.value > hiMassSlider.value )
        {
            loMassSlider.value = hiMassSlider.value;
        }
    }

    public void loSizeChanged ()
    {
        Configurator.config.size_lo = VALUE_SCALE * loSizeSlider.value;
        loSizeValue.text = $"{Configurator.config.size_lo:0.00}";

        if ( !syncing && loSizeSlider.value > hiSizeSlider.value )
        {
            hiSizeSlider.value = loSizeSlider.value;
        }
    }

    public void hiSizeChanged ()
    {
        Configurator.config.size_hi = VALUE_SCALE * hiSizeSlider.value;
        hiSizeValue.text = $"{Configurator.config.size_hi:0.00}";

        if ( !syncing && loSizeSlider.value > hiSizeSlider.value )
        {
            loSizeSlider.value = hiSizeSlider.value;
        }
    }

    public void numTrialsChanged ()
    {
        Configurator.config.num_trials = TRIALS_SCALE * (int) numTrialsSlider.value;
        numTrialsValue.text = $"{Configurator.config.num_trials}";
    }

    public void tonesChanged ()
    {
        Configurator.config.useTones = toneToggle.isOn;
    }

    public void bassChanged ()
    {
        Configurator.config.useBass = bassToggle.isOn;
    }

    public void chimeChanged ()
    {
        Configurator.config.useChimes = chimeToggle.isOn;
    }

    public void pianoChanged ()
    {
        Configurator.config.usePiano = pianoToggle.isOn;
    }

    public void coloursChanged ()
    {
        Configurator.config.useColours = colourToggle.isOn;
    }

    public void modeChanged ()
    {
        Configurator.config.use2AFC = use2AFCToggle.isOn;
    }

    public void startExperiment ()
    {
        if ( Configurator.config.use2AFC )
        {
            SceneManager.LoadScene("CD_ratios_2afc");
        }
        else
        {
            SceneManager.LoadScene("CD_ratios_single");
        }
    }
}
