import 'package:asciineverdie/src/shared/animation/character_frames.dart';
import 'package:asciineverdie/src/core/model/combat_event.dart';

/// 전투 이벤트 → 애니메이션 효과 매핑 결과
typedef CombatEffects = ({
  BattlePhase targetPhase,
  bool isCritical,
  bool isBlock,
  bool isParry,
  bool isSkill,
  bool isEvade,
  bool isMiss,
  bool isDebuff,
  bool isDot,
});

/// 전투 이벤트에 따른 애니메이션 효과 결정
///
/// CombatEvent 타입을 분석하여 대응하는 BattlePhase와 이펙트 플래그를 반환합니다.
CombatEffects mapCombatEventToEffects(CombatEvent event) {
  return switch (event.type) {
    // 플레이어 공격 -> prepare 페이즈부터 시작 (준비 동작 표시)
    CombatEventType.playerAttack => (
      targetPhase: BattlePhase.prepare,
      isCritical: event.isCritical,
      isBlock: false,
      isParry: false,
      isSkill: false,
      isEvade: false,
      isMiss: false,
      isDebuff: false,
      isDot: false,
    ),
    // 스킬 사용 -> prepare 페이즈부터 시작 + 스킬 이펙트
    CombatEventType.playerSkill => (
      targetPhase: BattlePhase.prepare,
      isCritical: event.isCritical,
      isBlock: false,
      isParry: false,
      isSkill: true,
      isEvade: false,
      isMiss: false,
      isDebuff: false,
      isDot: false,
    ),
    // 몬스터 공격 -> prepare 페이즈부터 시작
    CombatEventType.monsterAttack => (
      targetPhase: BattlePhase.prepare,
      isCritical: false,
      isBlock: false,
      isParry: false,
      isSkill: false,
      isEvade: false,
      isMiss: false,
      isDebuff: false,
      isDot: false,
    ),
    // 블록 -> hit 페이즈 + 블록 이펙트
    CombatEventType.playerBlock => (
      targetPhase: BattlePhase.hit,
      isCritical: false,
      isBlock: true,
      isParry: false,
      isSkill: false,
      isEvade: false,
      isMiss: false,
      isDebuff: false,
      isDot: false,
    ),
    // 패리 -> hit 페이즈 + 패리 이펙트
    CombatEventType.playerParry => (
      targetPhase: BattlePhase.hit,
      isCritical: false,
      isBlock: false,
      isParry: true,
      isSkill: false,
      isEvade: false,
      isMiss: false,
      isDebuff: false,
      isDot: false,
    ),
    // 플레이어 회피 -> recover 페이즈 + 회피 텍스트
    CombatEventType.playerEvade => (
      targetPhase: BattlePhase.recover,
      isCritical: false,
      isBlock: false,
      isParry: false,
      isSkill: false,
      isEvade: true,
      isMiss: false,
      isDebuff: false,
      isDot: false,
    ),
    // 몬스터 회피 -> idle 페이즈 + 미스 텍스트
    CombatEventType.monsterEvade => (
      targetPhase: BattlePhase.idle,
      isCritical: false,
      isBlock: false,
      isParry: false,
      isSkill: false,
      isEvade: false,
      isMiss: true,
      isDebuff: false,
      isDot: false,
    ),
    // 회복/버프 -> idle 페이즈 유지
    CombatEventType.playerHeal || CombatEventType.playerBuff => (
      targetPhase: BattlePhase.idle,
      isCritical: false,
      isBlock: false,
      isParry: false,
      isSkill: false,
      isEvade: false,
      isMiss: false,
      isDebuff: false,
      isDot: false,
    ),
    // 디버프 적용 -> idle 페이즈 + 디버프 텍스트
    CombatEventType.playerDebuff => (
      targetPhase: BattlePhase.idle,
      isCritical: false,
      isBlock: false,
      isParry: false,
      isSkill: false,
      isEvade: false,
      isMiss: false,
      isDebuff: true,
      isDot: false,
    ),
    // DOT 틱 -> attack 페이즈 + DOT 텍스트
    CombatEventType.dotTick => (
      targetPhase: BattlePhase.attack,
      isCritical: false,
      isBlock: false,
      isParry: false,
      isSkill: false,
      isEvade: false,
      isMiss: false,
      isDebuff: false,
      isDot: true,
    ),
    // 물약 사용/드랍 -> idle 페이즈 유지
    CombatEventType.playerPotion || CombatEventType.potionDrop => (
      targetPhase: BattlePhase.idle,
      isCritical: false,
      isBlock: false,
      isParry: false,
      isSkill: false,
      isEvade: false,
      isMiss: false,
      isDebuff: false,
      isDot: false,
    ),
  };
}

/// 전투 이벤트에서 공격자 타입 결정 (Phase 7)
AttackerType getAttackerType(CombatEventType type) {
  return switch (type) {
    CombatEventType.playerAttack ||
    CombatEventType.playerSkill => AttackerType.player,
    CombatEventType.monsterAttack => AttackerType.monster,
    _ => AttackerType.none,
  };
}
