using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Unity.VisualScripting;

public class GeorgsMinMaxNode : Unit
{

    /// <summary>
    /// REGENERATE NODES WHEN YOU CHANGE THIS
    /// </summary>


    // INPUT/OUTPUT TRIGGER
    [DoNotSerialize] public ControlInput inputTrigger;
    [DoNotSerialize] public ControlOutput outputTrigger;


    // INPUT/OUTPUT VALUES
    [DoNotSerialize] public ValueInput inputValue;
    [DoNotSerialize] public ValueInput minimumOutput;
    [DoNotSerialize] public ValueInput maximumOutput;
    [DoNotSerialize] public ValueOutput outputResult;

    // TEMP CALCULATION VALUES
    private float resultValue;


    // ACTUAL LOGIC FOR REMAPPING
    float Remap(float value, float min, float max, float newMin, float newMax)
    {
        return Mathf.Lerp(newMin, newMax, Mathf.InverseLerp(min, max, value));
    }


    // SETS THE FLOW OF THE NODE
    protected override void Definition() 
    {
        // READ AND CALCULATE ACTUAL VALUES
        inputTrigger = ControlInput("inputTrigger", (flow) =>
            {
                // GET INPUT AND CLEAN UP IF NOT 0-1
                float inputFloat = flow.GetValue<float>(inputValue);

                if (inputFloat > 1f || inputFloat < 0f)
                {
                    Debug.LogWarning("Inputvalue not between 0/1, normalizing it.");
                    inputFloat = Mathf.Clamp01(inputFloat);
                }

                // READ VALUES FROM INPUT NODES AND SET TEMP VARIABLE
                float minOutputFloat = flow.GetValue<float>(minimumOutput);
                float maxOutputFloat = flow.GetValue<float>(maximumOutput);
                resultValue = Remap(inputFloat, 0f, 1f, minOutputFloat, maxOutputFloat);

                
                return outputTrigger;
            });


            // SET DEFAULT VALUES / TYPES
            inputValue = ValueInput<float>("inputValueNormalized", 0.0f);
            minimumOutput = ValueInput<float>("minimumOutput", 10.0f);
            maximumOutput = ValueInput<float>("maximumOutput", 100.0f);
            outputTrigger = ControlOutput("outputTrigger");

            // OUTPUT ACTUAL VALUES
            outputResult = ValueOutput<float>("result", (flow => resultValue));
    }
}


