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

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 Vector3 initialPosition;
    private Vector3 velocity;

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

    private void Start()
    {
        initialPosition = transform.position;
    }

    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 FixedUpdate()
    {
        transform.position += velocity * Time.fixedDeltaTime * _settings.ObjectTimeScale;
    }

    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;

        // var shake = _graphics.transform.DOShakePosition(
        //     fallAwayTime,
        //     _settings.FallawayFloor.ShakeStrength);
        FMODUnity.RuntimeManager.PlayOneShot(_settings.FallawayFloor.FMODEvent, transform.position );

        if (_graphics.TryGetComponent(out BoxCollider box)) box.enabled = false;
        
        float elapsed = 0f;
        
        // wait a moment
        // yield return new WaitForSeconds(fallAwayTime);
        
        while (elapsed < fallAwayTime)
        {
            elapsed += Time.deltaTime * _settings.ObjectTimeScale;
            yield return null;
        }
        
        // fall
        velocity = Vector3.down * speed;
    }

    public void Reset()
    {
        _triggered = false;
        transform.position = initialPosition;
        velocity = Vector3.zero;
        
        if (_graphics && _graphics.TryGetComponent(out BoxCollider box)) box.enabled = true;
    }
}