import 'package:asciineverdie/src/core/model/combat_event.dart';
import 'package:asciineverdie/src/core/model/equipment_item.dart';
import 'package:asciineverdie/src/core/model/equipment_slot.dart';
import 'package:asciineverdie/src/core/model/item_stats.dart';

/// 사망 원인 (Death Cause)
enum DeathCause {
  /// 몬스터에 의한 사망
  monster,

  /// 자해 스킬에 의한 사망
  selfDamage,

  /// 환경 피해에 의한 사망
  environment,
}

/// 사망 정보 (Phase 4)
///
/// 사망 시점의 정보와 상실한 아이템을 기록
class DeathInfo {
  const DeathInfo({
    required this.cause,
    required this.killerName,
    required this.lostEquipmentCount,
    required this.goldAtDeath,
    required this.levelAtDeath,
    required this.timestamp,
    this.lostItemName,
    this.lostItemSlot,
    this.lostItemRarity,
    this.lostItem,
    this.lastCombatEvents = const [],
  });

  /// 사망 원인
  final DeathCause cause;

  /// 사망시킨 몬스터/원인 이름
  final String killerName;

  /// 상실한 장비 개수 (0 또는 1)
  final int lostEquipmentCount;

  /// 제물로 바친 아이템 이름 (null이면 없음)
  final String? lostItemName;

  /// 제물로 바친 아이템 슬롯 (null이면 없음)
  final EquipmentSlot? lostItemSlot;

  /// 제물로 바친 아이템 희귀도 (null이면 없음)
  final ItemRarity? lostItemRarity;

  /// 상실한 장비 전체 정보 (광고 부활 시 복구용)
  final EquipmentItem? lostItem;

  /// 사망 시점 골드
  final int goldAtDeath;

  /// 사망 시점 레벨
  final int levelAtDeath;

  /// 사망 시각 (밀리초)
  final int timestamp;

  /// 사망 직전 전투 이벤트 (최대 10개)
  final List<CombatEvent> lastCombatEvents;

  DeathInfo copyWith({
    DeathCause? cause,
    String? killerName,
    int? lostEquipmentCount,
    String? lostItemName,
    EquipmentSlot? lostItemSlot,
    ItemRarity? lostItemRarity,
    EquipmentItem? lostItem,
    int? goldAtDeath,
    int? levelAtDeath,
    int? timestamp,
    List<CombatEvent>? lastCombatEvents,
  }) {
    return DeathInfo(
      cause: cause ?? this.cause,
      killerName: killerName ?? this.killerName,
      lostEquipmentCount: lostEquipmentCount ?? this.lostEquipmentCount,
      lostItemName: lostItemName ?? this.lostItemName,
      lostItemSlot: lostItemSlot ?? this.lostItemSlot,
      lostItemRarity: lostItemRarity ?? this.lostItemRarity,
      lostItem: lostItem ?? this.lostItem,
      goldAtDeath: goldAtDeath ?? this.goldAtDeath,
      levelAtDeath: levelAtDeath ?? this.levelAtDeath,
      timestamp: timestamp ?? this.timestamp,
      lastCombatEvents: lastCombatEvents ?? this.lastCombatEvents,
    );
  }
}
