using System;
using Cirno.Scripts.Interactables;
using Cirno.Scripts.Resources.Events;
using Godot;
using Godot.Collections;

namespace Cirno.Scripts.Activables;

public partial class ScriptableBase : Node2D, IActivable
{
    [Export] public Array<EventResource> Events { get; set; } = [];
    
    private EventResource CurrentEvent => Events[_currentEventIndex];
    
    private int _currentEventIndex = 0;
    
    private bool _started = false;

    public override void _Ready()
    {
        foreach (var item in Events)
        {
           item.Init(this);
        }
    }

    public void Start()
    {
        _started = true;
        StartEvent(CurrentEvent);
    }

    private void StartEvent(EventResource eventResource)
    {
        eventResource.Start(this);
    }

    public override void _Process(double delta)
    {
        if (!_started) return;
        
        CurrentEvent.UpdateEvent(delta);

        if (!CurrentEvent.WaitForCompletion || CurrentEvent.IsComplete())
        {
            // This loops
            _currentEventIndex++;
            if (_currentEventIndex >= Events.Count)
            {
                // It's over
                _started = false;
                _currentEventIndex = 0;
                return;
            }
            
            CurrentEvent.Start(this);
        }
    }

    public bool Activate(ActivationType activationType = ActivationType.Toggle)
    {
        Start();

        return true;
    }

    public bool CanActivate()
    {
        return true;
    }
}