/// ASCII 셀 색상 (4색 팔레트 + 무기 등급 색상)
enum AsciiCellColor {
  /// 배경색 (검정)
  background,

  /// 오브젝트 (흰색) - 캐릭터, 몬스터, 지형
  object,

  /// 포지티브 이펙트 (시안) - !, +, =, >, < / common 무기
  positive,

  /// 네거티브 이펙트 (마젠타) - *, ~
  negative,

  // ═══════════════════════════════════════════════════════════════════════
  // 무기 등급(ItemRarity) 색상 (Phase 9)
  // ═══════════════════════════════════════════════════════════════════════

  /// Uncommon 등급 (초록)
  rarityUncommon,

  /// Rare 등급 (파랑)
  rarityRare,

  /// Epic 등급 (보라)
  rarityEpic,

  /// Legendary 등급 (금색)
  rarityLegendary,
}

/// 단일 ASCII 셀 데이터
class AsciiCell {
  const AsciiCell({required this.char, this.color = AsciiCellColor.object});

  /// 표시할 문자 (단일 문자)
  final String char;

  /// 셀 색상 타입
  final AsciiCellColor color;

  /// 빈 셀 (투명)
  static const empty = AsciiCell(char: ' ');

  /// 문자가 공백인지 확인 (투명 처리용)
  bool get isEmpty => char == ' ' || char.isEmpty;

  /// 문자에서 색상 자동 결정
  static AsciiCellColor colorFromChar(String char) {
    // 포지티브 이펙트 문자 (시안)
    if ('!+=><'.contains(char)) return AsciiCellColor.positive;
    // 네거티브 이펙트 문자 (마젠타)
    if ('*~'.contains(char)) return AsciiCellColor.negative;
    // 기본 오브젝트 (흰색)
    return AsciiCellColor.object;
  }

  /// 문자열에서 AsciiCell 생성 (자동 색상)
  factory AsciiCell.fromChar(String char) {
    if (char.isEmpty || char == ' ') return empty;
    return AsciiCell(char: char, color: colorFromChar(char));
  }

  @override
  bool operator ==(Object other) =>
      identical(this, other) ||
      other is AsciiCell &&
          runtimeType == other.runtimeType &&
          char == other.char &&
          color == other.color;

  @override
  int get hashCode => char.hashCode ^ color.hashCode;
}
