using Ktyl.Util;
using System;
using System.Collections;
using System.Collections.Generic;
using DG.Tweening;
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;

    public bool Falling => _triggered;
    private bool _triggered = false;

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

    private void LateUpdate()
    {
        if (!_triggered)
        {
            transform.position = initialPosition;
            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 && other.CompareTag("Player"))
        {
            Fall();
        }
    }

    //The platform gets destroyed after the player resumes frozen time on a platform
    private void OnTriggerStay(Collider other)
    {
        if (!_triggered && other.CompareTag("Player"))
        {
            Fall();
        }
    }

    public void Fall()
    {
        // already falling
        if (_triggered) return;
        
        // time stop
        if ( _settings.ObjectTimeScale.AsBool ) return;
        
        StartCoroutine(FallCR());
    }
    
    private IEnumerator FallCR()
    {
        _triggered = true;
        
        _graphics.transform.DOShakePosition(
            fallAwayTime, 
            _settings.FallawayFloor.ShakeStrength);
        FMODUnity.RuntimeManager.PlayOneShot(_settings.FallawayFloor.FMODEvent);
        
        // wait a moment
        yield return new WaitForSeconds(fallAwayTime);
        
        // fall
        rb.velocity = Vector3.down * speed;
    }

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