Documentation
use fmc::{
    blocks::{BlockId, Blocks},
    items::Items,
    players::{Player, Target, Targets},
    prelude::*,
    world::{BlockUpdate, WorldMap},
};

use super::{ItemRegistry, ItemUses};

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

fn register_seeds(
    mut commands: Commands,
    blocks: Res<Blocks>,
    items: Res<Items>,
    mut usable_items: ResMut<ItemRegistry>,
) {
    usable_items.insert(
        items.get_id("wheat_seeds").unwrap(),
        commands
            .spawn((
                ItemUses::default(),
                SeedConfig {
                    air: blocks.get_id("air"),
                    soil: blocks.get_id("soil"),
                },
            ))
            .id(),
    );
}

#[derive(Component)]
struct SeedConfig {
    pub air: BlockId,
    pub soil: BlockId,
}

fn use_seeds(
    world_map: Res<WorldMap>,
    player_query: Query<&Targets, With<Player>>,
    mut hoe_uses: Query<(&mut ItemUses, &SeedConfig), Changed<ItemUses>>,
    mut block_update_writer: EventWriter<BlockUpdate>,
) {
    let Ok((mut uses, config)) = hoe_uses.get_single_mut() else {
        return;
    };

    for player_entity in uses.read() {
        let targets = player_query.get(player_entity).unwrap();

        let Some(Target::Block { block_position, .. }) =
            targets.get_first_block(|block_id| *block_id == config.soil)
        else {
            continue;
        };

        if let Some(above_block) = world_map.get_block(*block_position + IVec3::Y) {
            if above_block != config.air {
                continue;
            }
        } else {
            continue;
        }

        block_update_writer.send(BlockUpdate::Replace {
            position: *block_position + IVec3::Y,
            block_id: Blocks::get().get_id("wheat_0"),
            block_state: None,
            block_data: None,
        });
    }
}