using Cirno.Scripts.Components.Actors;
using Cirno.Scripts.Enums;
using Godot;

namespace Cirno.Scripts.Components.FSM.Player;

public partial class PlayerGrazingModule : PlayerArea2DModule
{
    [Export] public BulletOwner Owner { get; private set; } = BulletOwner.Player;

    [Export] public ActorResourceProvider Shield { get; private set; }

    private bool _enabled = false;

    public bool Enabled
    {
        get => _enabled;
        set
        {
            if (_enabled == value) return;
            _enabled = value;
        }
    }

    public override void EnterState(PlayerState state)
    {
        Enabled = true;
        this.AreaEntered += OnAreaEntered;
    }

    private void OnAreaEntered(Area2D area)
    {
        if (!Enabled) return;
        if (area is Bullet bullet)
        {
            if (!bullet.Enabled) return;
            if (bullet.IsGrazed) return;
            if (!bullet.BulletInfo.Grazeable) return;
            if (bullet.BulletOwner is BulletOwner.Player) return;

            bullet.Graze();
            //bullet.IsGrazed = true;
            var baseGrazeValue = bullet.BulletInfo.GrazeValue;

            float grazeShield = baseGrazeValue * GlobalState.Instance.SessionSettings.DifficultyDamageMultiplier;
            
            Shield.CurrentResource += grazeShield;
            
            // check if it's grazed
            // check if it's grazeable
            // restore appropriate amount of shield
        }
    }

    public override void ExitState(PlayerState state)
    {
        Enabled = false;
        this.AreaEntered -= OnAreaEntered;
    }

    public override void Process(double delta)
    {
    }

    public override void PhysicsProcess(double delta)
    {
    }
}