using System;
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
using XCharts.Runtime;

public class EnvironmentUIControl : MonoBehaviour
{
    public GameObject TargetControllerObj;
    public GameObject ParameterContainerObj;
    public GameObject GroundCanvasObj;
    public GameObject chartObj;
    public TextMeshProUGUI remainTimeText;
    public TextMeshProUGUI targetTypeText;
    public TextMeshProUGUI winLoseText;
    public float resultTimeout = 1f;
    public GameObject gaugeImgObj;

    private LineChart realTimeRewardChart = null;
    private TargetController targetController;
    private ParameterContainer paramContainer;
    private Image gaugeImg;
    private float overTime = 0f;
    private int step = 0;
    private bool resultActive = false;

    // Start is called before the first frame update
    void Start()
    {
        targetController = TargetControllerObj.GetComponent<TargetController>();
        paramContainer = ParameterContainerObj.GetComponent<ParameterContainer>();
        gaugeImg = gaugeImgObj.GetComponent<Image>();
    }

    // Update is called once per frame
    void Update()
    {
        int remainTime = Convert.ToInt32(targetController.startTime + paramContainer.timeLimit - Time.time);
        remainTimeText.text = "RemainTime:" + remainTime.ToString();
        if (resultActive && Time.time - overTime >= resultTimeout)
        {
            // while result is active and show time over timeOut
            // clear the result
            Debug.Log("clear result");
            winLoseText.text = "";
            winLoseText.color = Color.white;
            resultActive = false;
        }
    }
    public void updateChart(float reward)
    {
        step += 1;
        realTimeRewardChart.AddXAxisData(Convert.ToString(step));
        realTimeRewardChart.AddData(0, reward);
    }

    public void initChart()
    {
        if (paramContainer.chartOn && realTimeRewardChart == null)
        {
            Vector3 chartPos = new Vector3(-210f, 90f, 0f) * GroundCanvasObj.transform.localScale.x;
            realTimeRewardChart = chartObj.AddComponent<LineChart>();
            realTimeRewardChart.Init();
        }
        realTimeRewardChart.RemoveData();
        realTimeRewardChart.AddSerie<Line>("Rewards");
    }

    // show result in UI
    public void showResult(int resultState)
    {
        switch (resultState)
        {
            case (int)TargetController.EndType.Win:
                //Win
                Debug.Log("win");
                winLoseText.text = "Win";
                winLoseText.color = Color.green;
                overTime = Time.time;
                resultActive = true;
                break;
            case (int)TargetController.EndType.Lose:
                //lose
                Debug.Log("lose");
                winLoseText.text = "Lose";
                winLoseText.color = Color.red;
                overTime = Time.time;
                resultActive = true;
                break;
            default:
                break;
        }
    }

    // update firebases target state gauge
    public void updateTargetGauge(float firebasesBelong, float belongMaxPoint)
    {
        if (firebasesBelong >= 0)
        {
            gaugeImgObj.transform.localPosition = new Vector3(25f, 0, 0);
            gaugeImg.color = Color.blue;
            gaugeImg.fillOrigin = 0;
            gaugeImg.fillAmount = firebasesBelong / belongMaxPoint;
        }
        else
        {
            gaugeImgObj.transform.localPosition = new Vector3(-25f, 0, 0);
            gaugeImg.color = Color.red;
            gaugeImg.fillOrigin = 1;
            gaugeImg.fillAmount = -firebasesBelong / belongMaxPoint;
        }
    }
    // update targetType text
    public void updateTargetType(int targetInt)
    {
        switch (targetInt)
        {
            case (int)TargetController.Targets.Go:
                targetTypeText.text = "GOTO";
                targetTypeText.color = Color.blue;
                break;
            case (int)TargetController.Targets.Attack:
                targetTypeText.text = "Attack!";
                targetTypeText.color = Color.red;
                break;
            case (int)TargetController.Targets.Defence:
                targetTypeText.text = "Defence";
                targetTypeText.color = Color.green;
                break;
            case (int)TargetController.Targets.Free:
                targetTypeText.text = "Free";
                targetTypeText.color = Color.yellow;
                break;
            default:
                targetTypeText.text = "TYPE ERROR";
                targetTypeText.color = Color.red;
                break;
        }
    }
}