Documentation
use fmc::{items::Items, players::Player, prelude::*};

use crate::players::{HealEvent, Inventory};

use super::{ItemRegistry, ItemUses};

pub struct BreadPlugin;
impl Plugin for BreadPlugin {
    fn build(&self, app: &mut App) {
        app.add_systems(Startup, register_bread)
            .add_systems(Update, eat_bread.after(super::ItemUseSystems));
    }
}

#[derive(Component)]
struct Bread;

fn register_bread(
    mut commands: Commands,
    items: Res<Items>,
    mut usable_items: ResMut<ItemRegistry>,
) {
    usable_items.insert(
        items.get_id("bread").unwrap(),
        commands.spawn((ItemUses::default(), Bread)).id(),
    );
}

fn eat_bread(
    mut bread_uses: Query<&mut ItemUses, (With<Bread>, Changed<ItemUses>)>,
    mut player_query: Query<&mut Inventory, With<Player>>,
    mut heal_events: EventWriter<HealEvent>,
) {
    let Ok(mut uses) = bread_uses.get_single_mut() else {
        return;
    };

    for player_entity in uses.read() {
        let mut inventory = player_query.get_mut(player_entity).unwrap();
        let held_item = inventory.held_item_stack_mut();

        heal_events.send(HealEvent {
            player_entity,
            healing: 8,
        });

        held_item.take(1);
    }
}