using System;
using System.Collections;
using System.Collections.Generic;
using DG.Tweening;
using Ktyl.Util;
using UnityEngine;

[RequireComponent(typeof(Rigidbody))]
public class FallawayFloor : MonoBehaviour
{
    // // Speed at which the object moves towards the ground.
    public float speed;
    // Time it takes for ogjecct to begin moving towards the ground.
    public float fallAwayTime;
    
    [SerializeField] private TrapSettings _settings;
    [SerializeField] private GameObject _graphics;
    
    private Rigidbody rb;
    private Vector3 initialPosition;
    
    private float? _triggered = null;

    private void Start()
    {
        initialPosition = transform.position;
        
        // Get Rigidbody component.
        rb = GetComponent<Rigidbody>();
    }

    private void LateUpdate()
    {
        if (!_triggered.HasValue) return;

        if (_settings.SafeTime > _settings.FallawayFloor.SafeResetTime)
        {
            Reset();

            // pop in animation
            transform.localScale = Vector3.zero;
            transform
                .DOScale(Vector3.one, 0.5f)
                .SetEase(_settings.FallawayFloor.PopInEase);
        }
    }

    private void OnTriggerEnter(Collider other)
    {
        if (!_triggered.HasValue && other.CompareTag("Player"))
        {
            StartCoroutine(Fall());
        }
    }

    private IEnumerator Fall()
    {
        _graphics.transform.DOShakePosition(
            fallAwayTime, 
            _settings.FallawayFloor.ShakeStrength);
        FMODUnity.RuntimeManager.PlayOneShot(_settings.FallawayFloor.FMODEvent);
        
        _triggered = Time.time;
        
        // wait a moment
        yield return new WaitForSeconds(fallAwayTime);
        
        // fall
        rb.velocity = Vector3.down * speed;
    }

    public void Reset()
    {
        _triggered = null;
        transform.position = initialPosition;
        rb.velocity = Vector3.zero;
    }
}
