import 'package:asciineverdie/src/shared/animation/monster_size.dart';
import 'package:asciineverdie/src/core/model/monster_grade.dart';

/// 태스크 타입 (원본 fTask.Caption 값들에 대응)
enum TaskType {
  neutral, // heading 등 일반 이동
  kill, // 몬스터 처치
  load, // 로딩/초기화
  plot, // 플롯 진행
  market, // 시장으로 이동 중
  sell, // 아이템 판매 중
  buying, // 장비 구매 중
}

/// 태스크 정보 (Task Info)
class TaskInfo {
  const TaskInfo({
    required this.caption,
    required this.type,
    this.monsterBaseName,
    this.monsterPart,
    this.monsterLevel,
    this.monsterGrade,
    this.monsterSize,
  });

  final String caption;
  final TaskType type;

  /// 킬 태스크의 몬스터 기본 이름 (형용사 제외, 예: "Goblin")
  final String? monsterBaseName;

  /// 킬 태스크의 전리품 부위 (예: "claw", "tail", "*"는 WinItem)
  final String? monsterPart;

  /// 킬 태스크의 몬스터 레벨 (전투 스탯 계산용)
  final int? monsterLevel;

  /// 킬 태스크의 몬스터 등급 (Normal/Elite/Boss)
  final MonsterGrade? monsterGrade;

  /// 킬 태스크의 몬스터 사이즈 (애니메이션 크기 결정용, Act 기반)
  final MonsterSize? monsterSize;

  factory TaskInfo.empty() =>
      const TaskInfo(caption: '', type: TaskType.neutral);

  TaskInfo copyWith({
    String? caption,
    TaskType? type,
    String? monsterBaseName,
    String? monsterPart,
    int? monsterLevel,
    MonsterGrade? monsterGrade,
    MonsterSize? monsterSize,
  }) {
    return TaskInfo(
      caption: caption ?? this.caption,
      type: type ?? this.type,
      monsterBaseName: monsterBaseName ?? this.monsterBaseName,
      monsterPart: monsterPart ?? this.monsterPart,
      monsterLevel: monsterLevel ?? this.monsterLevel,
      monsterGrade: monsterGrade ?? this.monsterGrade,
      monsterSize: monsterSize ?? this.monsterSize,
    );
  }
}
