﻿using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;

public class BotInput : MonoBehaviour
{
    [SerializeField]
    private Transform _targetTrans; //это цель для бота, сам решай как он ее себе поставит, тут я ее просто вручную занес
    [SerializeField]
    private float _stoppingDist = 3; //как близко бот подойдет

    private TankMover _tankMover;
    private TowerMover _towerMover;

    private Transform _selfTrans;

    private const float _tempStoppingDist = 1f; //это только для подхода посложнее
    private Vector3 _tempTargetPos; //это только для подхода посложнее

    private void Start()
    {
        _tankMover = GetComponent<TankMover>();
        _towerMover = GetComponent<TowerMover>();

        _selfTrans = transform;

        _tempTargetPos = GetNextPoint();
    }

    private  void Update ()
    {
        // начало самого простого подхода
        /*
        var inputDirection = Vector3.zero;
        var dist = (_targetTrans.position - _selfTrans.position).sqrMagnitude;
        if (dist > _stoppingDist * _stoppingDist)
        {
            inputDirection = (_targetTrans.position - _selfTrans.position).normalized;
            inputDirection.y = 0;
        }
         */
        //конец самого простого подхода

        // начало сложного подхода (я его сочинил за 30 минут, потому не отвечаю за возможные баги или приходы у бота :))
        var inputDirection = Vector3.zero; //изначально бот ничего не жмет
        var distToTarget = (_targetTrans.position - _selfTrans.position).sqrMagnitude; //меряем расстояние до цели
        if (distToTarget > _stoppingDist * _stoppingDist) //если нке доехали, то
        {
            Debug.DrawLine(_tempTargetPos, _tempTargetPos + Vector3.up, Color.red); //рисуем точку, в которую едем в следующую (только на сцене видно)
            var distToTempPos = (_tempTargetPos - _selfTrans.position).sqrMagnitude; //меряем дистанцию до этой точки
            if (distToTempPos > _tempStoppingDist * _tempStoppingDist) //если не доехали, то
            {
                inputDirection = (_tempTargetPos - _selfTrans.position).normalized; //едем
                inputDirection.y = 0;
            } 
            else //иначе
            {
                _tempTargetPos = GetNextPoint(); //просим следующую точку
            }
                
        }
        // конец сложного подхода

        _tankMover.SetInput(inputDirection);

        _towerMover.SetInput(_targetTrans.position);
    }

    private Vector3 GetNextPoint()
    {
        NavMeshPath path = new NavMeshPath();
        if (NavMesh.CalculatePath(_selfTrans.position, _targetTrans.position, -1, path)) //если путь посчитать можно, то
            return path.corners[1]; //едем к следуещей ближайшей точке пути
        else //иначе
            return _targetTrans.position; //едем сразу к персонажу
    }
}
