use crate::enemy::Enemy;

pub struct Damage {}
impl Damage {
    pub const PHYSICAL: i32 = 0;
    pub const ACID: i32 = 1;
}

/// A damage type's magnitude rule: "how much damage does this deal against *this* target".
/// Deliberately a pure function of `(base, target)` — no `Command` access, no `&mut self`
/// state, no knowledge of the projectile or status system. That constraint is what keeps
/// damage types a leaf in the behavior graph instead of another nesting point: a damage type
/// can never trigger another behavior, it can only answer "how much".
pub trait DamageBehavior: Send + Sync {
    fn compute(&self, base: f32, target: &Enemy) -> f32;
}

#[derive(Clone)]
pub struct Physical;
impl DamageBehavior for Physical {
    fn compute(&self, base: f32, _target: &Enemy) -> f32 {
        base
    }
}

#[derive(Clone)]
pub struct Acid;
impl DamageBehavior for Acid {
    fn compute(&self, base: f32, _target: &Enemy) -> f32 {
        base
    }
}

#[derive(Clone)]
pub struct Poison;
impl DamageBehavior for Poison {
    fn compute(&self, base: f32, _target: &Enemy) -> f32 {
        base
    }
}
