using System.Collections.Generic;
using UnityEngine;

public class ParameterContainer : MonoBehaviour
{
    [SerializeField] private GameObject targetConObj;
    [SerializeField] private GameObject blockConObj;
    [SerializeField] private GameObject agentObj;
    [SerializeField] private GameObject hudObj;

    private TargetController targetCon;
    private SceneBlockContainer blockCont;
    private CommonParameterContainer commonParamCont;
    private int agentInArea;

    [Header("Dynamic Rewards")]
    [Tooltip("Free mode Hit Enemy reward")]
    public float hitTargetReward = 60.0f;

    [Tooltip("Enemy down in area Reward")]
    public float killTargetEnemyReward = 80.0f;

    [Tooltip("stay in firebasesArea reward")]
    public float inAreaReward = 5.0f;

    [Space(10)]
    [Tooltip("go Win reward")]
    public float goWinReward = 50.0f;

    [Tooltip("attack Win reward")]
    public float attackWinReward = 50.0f;

    [Tooltip("defence Win reward")]
    public float defenceWinReward = 50.0f;

    [Tooltip("free Win reward")]
    public float freeWinReward = 50.0f;

    private float targetTimeBonus = 0f;
    private float areaTimeBonus = 0f;
    private float freeTimeBonus = 0f;
    private float targetInAreaTime = 0f;
    private float lastFrameTime = 0f;

    private float areaTimeBonusPerSec;
    private float freeTimeBonusPerSec;
    private float targetTimeBonusPerSec;
    private int timeLimit = 30;

    private void Start()
    {
        targetCon = targetConObj.GetComponent<TargetController>();
        blockCont = blockConObj.GetComponent<SceneBlockContainer>();
        commonParamCont = CommonParameterContainer.Instance;

        areaTimeBonusPerSec = commonParamCont.areaTimeBonusPerSec;
        freeTimeBonusPerSec = commonParamCont.freeTimeBonusPerSec;
        targetTimeBonusPerSec = commonParamCont.targetTimeBonusPerSec;
        timeLimit = commonParamCont.timeLimit;

        areaTimeBonus = areaTimeBonusPerSec * timeLimit;
        freeTimeBonus = freeTimeBonusPerSec * timeLimit;
        targetTimeBonus = targetTimeBonusPerSec * timeLimit;

        // Win Rewards
        goWinReward = commonParamCont.goWinRewardDefault;
        attackWinReward = commonParamCont.attackWinRewardDefault;
        defenceWinReward = commonParamCont.defenceWinRewardDefault;
        freeWinReward = commonParamCont.freeWinRewardDefault;
    }

    private void Update()
    {
        // get target distance and in area
        if (targetCon.targetType is Targets.Go or Targets.Attack)
        {
            (_, agentInArea) = blockCont.GetAgentTargetDistanceAndInside(agentObj.transform.position);
            // attack goto or defence target
            if (agentInArea == 1)
            {
                // agent out of area
                targetInAreaTime += Time.time - lastFrameTime;
            }
            areaTimeBonus = areaTimeBonusPerSec * (targetCon.leftTime + targetInAreaTime);
            freeTimeBonus = freeTimeBonusPerSec * targetCon.leftTime;
            targetTimeBonus = targetTimeBonusPerSec * targetCon.leftTime;
            lastFrameTime = Time.time;
        }
        else
        {
            // free target
            areaTimeBonus = areaTimeBonusPerSec * targetCon.leftTime;
            freeTimeBonus = freeTimeBonusPerSec * targetCon.leftTime;
            targetTimeBonus = targetTimeBonusPerSec * targetCon.leftTime;
        }

        hitTargetReward = commonParamCont.hitTargetRewardDefault + targetTimeBonus;
        killTargetEnemyReward = commonParamCont.killTargetEnemyRewardDefault + targetTimeBonus;
        inAreaReward = commonParamCont.inAreaRewardDefault + areaTimeBonus;
    }

    public void ResetTimeBonusReward()
    {
        areaTimeBonus = areaTimeBonusPerSec * timeLimit;
        freeTimeBonus = freeTimeBonusPerSec * timeLimit;
        targetInAreaTime = 0f;
    }
}