import 'package:asciineverdie/src/core/model/combat_stats.dart';
import 'package:asciineverdie/src/core/model/monster_combat_stats.dart';

/// 단일 공격 결과
class AttackResult {
  const AttackResult({
    required this.damage,
    required this.isCritical,
    required this.isHit,
    required this.isBlocked,
    required this.isParried,
    required this.isEvaded,
  });

  /// 최종 데미지 (0이면 미스/회피)
  final int damage;

  /// 크리티컬 히트 여부
  final bool isCritical;

  /// 명중 여부
  final bool isHit;

  /// 방패로 막음 여부
  final bool isBlocked;

  /// 무기로 쳐냄 여부
  final bool isParried;

  /// 회피 여부
  final bool isEvaded;

  /// 공격 성공 여부 (데미지가 들어갔는지)
  bool get isSuccess => isHit && damage > 0;

  /// 미스 (명중 실패 또는 회피)
  factory AttackResult.miss() => const AttackResult(
    damage: 0,
    isCritical: false,
    isHit: false,
    isBlocked: false,
    isParried: false,
    isEvaded: true,
  );

  @override
  String toString() {
    if (!isHit) return 'Miss (evaded)';
    if (isBlocked) return 'Blocked ($damage dmg)';
    if (isParried) return 'Parried ($damage dmg)';
    if (isCritical) return 'Critical! ($damage dmg)';
    return 'Hit ($damage dmg)';
  }
}

/// 전투 턴 결과
class CombatTurnResult {
  const CombatTurnResult({
    required this.playerAttack,
    required this.monsterAttack,
    required this.updatedPlayerStats,
    required this.updatedMonsterStats,
    required this.isCombatOver,
    required this.isPlayerVictory,
  });

  /// 플레이어의 공격 결과 (null이면 공격 안 함)
  final AttackResult? playerAttack;

  /// 몬스터의 공격 결과 (null이면 공격 안 함)
  final AttackResult? monsterAttack;

  /// 업데이트된 플레이어 스탯
  final CombatStats updatedPlayerStats;

  /// 업데이트된 몬스터 스탯
  final MonsterCombatStats updatedMonsterStats;

  /// 전투 종료 여부
  final bool isCombatOver;

  /// 플레이어 승리 여부 (전투 종료 시에만 의미 있음)
  final bool isPlayerVictory;

  /// 플레이어 패배 여부
  bool get isPlayerDefeat => isCombatOver && !isPlayerVictory;
}

/// 전투 전체 결과 (전투 종료 시)
class CombatEndResult {
  const CombatEndResult({
    required this.isVictory,
    required this.expGained,
    required this.goldGained,
    required this.turnsElapsed,
    required this.totalDamageDealt,
    required this.totalDamageTaken,
    required this.finalPlayerStats,
    required this.finalMonsterStats,
  });

  /// 승리 여부
  final bool isVictory;

  /// 획득 경험치
  final int expGained;

  /// 획득 골드 (향후 확장)
  final int goldGained;

  /// 전투에 걸린 턴 수
  final int turnsElapsed;

  /// 플레이어가 입힌 총 데미지
  final int totalDamageDealt;

  /// 플레이어가 받은 총 데미지
  final int totalDamageTaken;

  /// 최종 플레이어 스탯
  final CombatStats finalPlayerStats;

  /// 최종 몬스터 스탯
  final MonsterCombatStats finalMonsterStats;

  /// 패배 여부
  bool get isDefeat => !isVictory;
}

/// 전투 상태
enum CombatPhase {
  /// 전투 시작 전
  notStarted,

  /// 전투 진행 중
  inProgress,

  /// 플레이어 승리로 종료
  playerVictory,

  /// 플레이어 패배로 종료
  playerDefeat,
}
