import 'package:flutter/material.dart';

import 'package:asciineverdie/src/shared/retro_colors.dart';

/// ASCII 애니메이션 4색 팔레트 (Phase 7)
///
/// 시각적 명확성을 위해 4가지 색상만 사용한다.
/// - 흰색/검정: 오브젝트 (캐릭터, 몬스터, 아이템) - 테마에 따라 변환
/// - 시안/파랑: 포지티브 이펙트 (힐, 버프, 레벨업, 획득) - 테마에 따라 변환
/// - 마젠타/빨강: 네거티브 이펙트 (데미지, 디버프, 사망, 손실) - 테마에 따라 변환
/// - 검정/밝은색: 배경 - 테마에 따라 변환
class AsciiColors {
  AsciiColors._();

  // ═══════════════════════════════════════════════════════════════════════
  // 동적 색상 Getter (테마에 따라 자동 전환)
  // ═══════════════════════════════════════════════════════════════════════

  /// 오브젝트 색상 (캐릭터, 몬스터, 아이템) - 테마 인식
  static Color objectOf(BuildContext context) =>
      RetroColors.isDarkMode(context) ? object : _lightObject;

  /// 포지티브 이펙트 색상 - 테마 인식
  static Color positiveOf(BuildContext context) =>
      RetroColors.isDarkMode(context) ? positive : _lightPositive;

  /// 네거티브 이펙트 색상 - 테마 인식
  static Color negativeOf(BuildContext context) =>
      RetroColors.isDarkMode(context) ? negative : _lightNegative;

  /// 배경 색상 - 테마 인식
  static Color backgroundOf(BuildContext context) =>
      RetroColors.isDarkMode(context) ? background : _lightBackground;

  // ═══════════════════════════════════════════════════════════════════════
  // 무기 등급(ItemRarity) 색상 Getter (테마 인식, Phase 9)
  // ═══════════════════════════════════════════════════════════════════════

  /// Uncommon 등급 색상 - 테마 인식
  static Color rarityUncommonOf(BuildContext context) =>
      RetroColors.isDarkMode(context) ? rarityUncommon : _lightRarityUncommon;

  /// Rare 등급 색상 - 테마 인식
  static Color rarityRareOf(BuildContext context) =>
      RetroColors.isDarkMode(context) ? rarityRare : _lightRarityRare;

  /// Epic 등급 색상 - 테마 인식
  static Color rarityEpicOf(BuildContext context) =>
      RetroColors.isDarkMode(context) ? rarityEpic : _lightRarityEpic;

  /// Legendary 등급 색상 - 테마 인식
  static Color rarityLegendaryOf(BuildContext context) =>
      RetroColors.isDarkMode(context) ? rarityLegendary : _lightRarityLegendary;

  // ═══════════════════════════════════════════════════════════════════════
  // 라이트 모드 색상 (양피지/크림 기반)
  // ═══════════════════════════════════════════════════════════════════════

  /// 라이트 모드 오브젝트 색상 (어두운 갈색)
  static const Color _lightObject = Color(0xFF2D1B0E);

  /// 라이트 모드 포지티브 이펙트 (진한 청록)
  static const Color _lightPositive = Color(0xFF006666);

  /// 라이트 모드 네거티브 이펙트 (진한 자주)
  static const Color _lightNegative = Color(0xFFAA0066);

  /// 라이트 모드 배경 (양피지 크림)
  static const Color _lightBackground = Color(0xFFF5E6C8);

  /// 라이트 모드 Uncommon 등급 (진한 초록)
  static const Color _lightRarityUncommon = Color(0xFF008800);

  /// 라이트 모드 Rare 등급 (진한 파랑)
  static const Color _lightRarityRare = Color(0xFF0055AA);

  /// 라이트 모드 Epic 등급 (진한 보라)
  static const Color _lightRarityEpic = Color(0xFF660099);

  /// 라이트 모드 Legendary 등급 (진한 금색)
  static const Color _lightRarityLegendary = Color(0xFFCC7700);

  // ═══════════════════════════════════════════════════════════════════════
  // 레거시 정적 색상 (다크 모드 기본값 / context 없는 곳에서 사용)
  // ═══════════════════════════════════════════════════════════════════════

  /// 오브젝트 색상 (캐릭터, 몬스터, 아이템)
  static const Color object = Colors.white;

  /// 포지티브 이펙트 색상 (힐, 버프, 레벨업, 획득)
  static const Color positive = Colors.cyan;

  /// 네거티브 이펙트 색상 (데미지, 디버프, 사망, 손실)
  static const Color negative = Color(0xFFFF00FF); // 마젠타

  /// 배경 색상
  static const Color background = Colors.black;

  // ═══════════════════════════════════════════════════════════════════════
  // 무기 등급(ItemRarity) 정적 색상 (다크 모드 기본값, Phase 9)
  // ═══════════════════════════════════════════════════════════════════════

  /// Uncommon 등급 (밝은 초록)
  static const Color rarityUncommon = Color(0xFF00FF00);

  /// Rare 등급 (밝은 파랑)
  static const Color rarityRare = Color(0xFF0088FF);

  /// Epic 등급 (밝은 보라)
  static const Color rarityEpic = Color(0xFF9900FF);

  /// Legendary 등급 (밝은 금색)
  static const Color rarityLegendary = Color(0xFFFFAA00);

  /// 상황에 따른 색상 반환
  static Color forContext(AsciiColorContext context) {
    return switch (context) {
      AsciiColorContext.idle => object,
      AsciiColorContext.attack => object,
      AsciiColorContext.critical => negative,
      AsciiColorContext.heal => positive,
      AsciiColorContext.buff => positive,
      AsciiColorContext.debuff => negative,
      AsciiColorContext.levelUp => positive,
      AsciiColorContext.death => negative,
      AsciiColorContext.itemGain => positive,
      AsciiColorContext.itemLoss => negative,
      AsciiColorContext.dodge => object,
      AsciiColorContext.block => object,
    };
  }
}

/// ASCII 애니메이션 색상 컨텍스트
enum AsciiColorContext {
  /// 대기 상태
  idle,

  /// 일반 공격
  attack,

  /// 크리티컬 히트
  critical,

  /// 회복
  heal,

  /// 버프 획득
  buff,

  /// 디버프 적용
  debuff,

  /// 레벨업
  levelUp,

  /// 사망
  death,

  /// 아이템 획득
  itemGain,

  /// 아이템 손실
  itemLoss,

  /// 회피 성공
  dodge,

  /// 방패 방어
  block,
}
