using System.Collections;
using UnityEngine;

public class Player : MonoBehaviour
{
    [Header("Setup")]
    [SerializeField]
    private InputManager _inputManager;
    [SerializeField]
    private GameObject _cameraGameObject;
    [SerializeField]
    private Animator _animator;
    
    [Header("Camera Options")]
    [SerializeField] private Vector3 camOffset;
    [SerializeField] private float cameraFollowSpeed = 2.5f;
    
    [Header("Player Options")]
    [Range(0f, 10f)]
    public float moveSpeed = 5f;
    [Range(0f, 100f)]
    public float animationSpeed = 30f;
    
    [Header("Enemy Snapping")]
    [SerializeField]
    private float minAimDistance;
    [SerializeField]
    private float maxAimDistance;
    
    [Header("Dash")]
    [Range(0f, 100f)]
    public float dashSpeed = 7f;
    [Range(0f, 1f)]
    public float dashTime = 0.2f;
    [Range(0f, 4f)]
    public float dashCooldownTime = 1f;
    [SerializeField]
    public TrailRenderer dashTrail;

    [Header("Attacking")]
    public LayerMask enemyLayer;
    

    private Camera _camera;
    private CharacterController _controller;
    
    private Animate _animate;
    private PlayerMove _playerMove;
    private PlayerRotate _playerRotate;
    private PlayerAttack _playerAttack;
    private CameraMove _cameraMove;
    
    // Start is called once before the first execution of Update after the MonoBehaviour is created
    void Start()
    {
        camOffset.z = camOffset.x;
        
        _camera = _cameraGameObject.GetComponent<Camera>();
        _controller = GetComponent<CharacterController>();

        _playerRotate = gameObject.AddComponent<PlayerRotate>();
        
        _animate = gameObject.AddComponent<Animate>();
        _animate.initialize(_animator);
        _playerAttack = gameObject.AddComponent<PlayerAttack>();
        //_playerAttack.initialize(_inputManager, enemyLayer, _animate);
        _playerMove = gameObject.AddComponent<PlayerMove>();
        _playerMove.initialize(_controller, dashTrail);
        _cameraMove = gameObject.AddComponent<CameraMove>();
        _cameraMove.initialize(transform, camOffset, cameraFollowSpeed, _camera.transform);
    }
    
    void Update()
    {
        Vector3 moveInput = new Vector3(_inputManager.moveInput.x, 0f , _inputManager.moveInput.y);

        Vector3 aimTarget = _playerRotate.AimTarget(minAimDistance, maxAimDistance, _camera, _inputManager.aimInput);
        
        Vector3 moveDirection = _playerMove.GetMoveDirection(moveInput, _camera.transform);
        Vector3 lookTarget = _playerRotate.LookTarget(moveDirection);
        moveDirection += _playerMove.Gravity();
        
        
        _playerMove.Dash(dashTime, dashCooldownTime, dashSpeed, _inputManager.sprintPerformed);
        _playerMove.ApplyMovement(moveDirection, lookTarget, moveSpeed);
        _cameraMove.MoveCamera();
        
        _animate.AnimateState("Walk", moveInput.magnitude, animationSpeed);
        
        /*
        //360 Char Animation
        //Vector3 localMoveDirection = transform.InverseTransformDirection(moveDirection);
        //_animate.AnimateState("X", localMoveDirection.x, animationSpeed);
        //_animate.AnimateState("Y", localMoveDirection.z, animationSpeed);
        
        //_playerAttack.Attack();
        */
    }
}