/// 스탯 타입 열거형 (stat type)
enum StatType { str, con, dex, intelligence, wis, cha }

/// 패시브 능력 타입 (passive ability type)
enum PassiveType {
  /// 경험치 배율 보너스
  expBonus,

  /// 마법 데미지 배율 보너스
  magicDamageBonus,

  /// 방어력 배율 보너스
  defenseBonus,

  /// 크리티컬 확률 보너스
  criticalBonus,

  /// HP 배율 보너스
  hpBonus,

  /// MP 배율 보너스
  mpBonus,
}

/// 패시브 능력 (passive ability)
///
/// 종족이나 클래스가 제공하는 수동적 효과
class PassiveAbility {
  const PassiveAbility({
    required this.type,
    required this.value,
    this.description = '',
  });

  /// 패시브 타입
  final PassiveType type;

  /// 효과 값 (배율의 경우 0.1 = 10%)
  final double value;

  /// 설명
  final String description;
}

/// 종족 특성 (race traits)
///
/// 각 종족이 가진 고유한 스탯 보정과 패시브 능력
class RaceTraits {
  const RaceTraits({
    required this.raceId,
    required this.name,
    required this.statModifiers,
    this.passives = const [],
    this.expMultiplier = 1.0,
  });

  /// 종족 식별자
  final String raceId;

  /// 종족 이름 (표시용)
  final String name;

  /// 스탯 보정치 맵
  final Map<StatType, int> statModifiers;

  /// 패시브 능력 목록
  final List<PassiveAbility> passives;

  /// 경험치 배율 (1.0 = 100%)
  final double expMultiplier;

  /// 특정 스탯의 보정치 반환
  int getModifier(StatType type) => statModifiers[type] ?? 0;

  /// 특정 패시브 타입의 값 반환 (없으면 0)
  double getPassiveValue(PassiveType type) {
    for (final passive in passives) {
      if (passive.type == type) return passive.value;
    }
    return 0.0;
  }

  /// 특정 패시브 보유 여부
  bool hasPassive(PassiveType type) {
    return passives.any((p) => p.type == type);
  }
}
