// 몬스터 크기 시스템
// Act와 몬스터 등급에 따라 ASCII 아트 크기 결정

import 'package:asciineverdie/src/core/model/monster_grade.dart';
import 'package:asciineverdie/src/core/util/deterministic_random.dart';

/// 몬스터 크기 enum
/// 실제 프레임 줄 수와 일치하도록 설정
enum MonsterSize {
  /// 2줄 (레벨 1-5)
  tiny(2),

  /// 4줄 (레벨 6-10)
  small(4),

  /// 6줄 (레벨 11-15)
  medium(6),

  /// 8줄 (레벨 16-25)
  large(8),

  /// 8줄 (레벨 26-35)
  huge(8),

  /// 8줄 (레벨 36-50)
  giant(8),

  /// 8줄 (레벨 51+, 보스급)
  titanic(8);

  const MonsterSize(this.lines);

  /// 해당 크기의 줄 수
  final int lines;
}

/// 몬스터 레벨에서 크기 결정
MonsterSize getMonsterSize(int? level) {
  if (level == null || level <= 0) return MonsterSize.tiny;

  if (level <= 5) return MonsterSize.tiny;
  if (level <= 10) return MonsterSize.small;
  if (level <= 15) return MonsterSize.medium;
  if (level <= 25) return MonsterSize.large;
  if (level <= 35) return MonsterSize.huge;
  if (level <= 50) return MonsterSize.giant;
  return MonsterSize.titanic;
}

/// 몬스터 크기에 따른 세로 패딩 계산 (7줄 프레임에서 중앙 정렬)
int getMonsterVerticalPadding(MonsterSize size) {
  return (7 - size.lines) ~/ 2;
}

// =============================================================================
// Act 기반 몬스터 사이즈 결정 (Phase 13)
// =============================================================================

/// 보스 몬스터 사이즈 결정 (Act별 고정)
///
/// - Prologue(1), Act I(2): small (4줄)
/// - Act II(3), Act III(4): medium (6줄)
/// - Act IV(5), Act V(6)+: large (8줄)
MonsterSize getBossSizeForAct(int plotStageCount) {
  if (plotStageCount <= 2) return MonsterSize.small;
  if (plotStageCount <= 4) return MonsterSize.medium;
  return MonsterSize.large;
}

/// 일반/엘리트 몬스터 사이즈 결정 (Act별 확률 랜덤)
///
/// Act가 진행될수록 큰 몬스터가 나올 확률 증가.
/// 프롤로그에서는 대형 몬스터 0%.
MonsterSize getRandomSizeForAct(int plotStageCount, DeterministicRandom rng) {
  final roll = rng.nextInt(100);

  // Act별 확률 테이블 (small %, medium %, large = 나머지)
  final (smallChance, mediumChance) = switch (plotStageCount) {
    <= 1 => (70, 30), // Prologue: 70% small, 30% medium, 0% large
    2 => (50, 40), // Act I: 50% small, 40% medium, 10% large
    3 => (35, 40), // Act II: 35% small, 40% medium, 25% large
    4 => (25, 40), // Act III: 25% small, 40% medium, 35% large
    5 => (15, 35), // Act IV: 15% small, 35% medium, 50% large
    _ => (10, 25), // Act V+: 10% small, 25% medium, 65% large
  };

  if (roll < smallChance) return MonsterSize.small;
  if (roll < smallChance + mediumChance) return MonsterSize.medium;
  return MonsterSize.large;
}

/// 몬스터 등급과 Act에 따른 사이즈 결정 (통합 함수)
///
/// 보스: Act별 고정 사이즈
/// 일반/엘리트: Act별 확률 랜덤
MonsterSize getMonsterSizeForAct({
  required int plotStageCount,
  required MonsterGrade grade,
  required DeterministicRandom rng,
}) {
  if (grade == MonsterGrade.boss) {
    return getBossSizeForAct(plotStageCount);
  }
  return getRandomSizeForAct(plotStageCount, rng);
}
