import 'dart:math' as math;

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

/// 랜덤/확률 관련 유틸리티 함수들
/// 원본 Main.pas의 랜덤 헬퍼 함수들을 포팅

/// 두 번의 랜덤 중 작은 값 반환 (낮은 인덱스 선호)
int randomLow(DeterministicRandom rng, int below) {
  return math.min(rng.nextInt(below), rng.nextInt(below));
}

/// 리스트에서 랜덤 선택
String pick(List<String> values, DeterministicRandom rng) {
  if (values.isEmpty) return '';
  return values[rng.nextInt(values.length)];
}

/// 리스트에서 낮은 인덱스 선호하여 선택
String pickLow(List<String> values, DeterministicRandom rng) {
  if (values.isEmpty) return '';
  return values[randomLow(rng, values.length)];
}

/// 64비트 범위 랜덤 (큰 범위용)
int random64Below(DeterministicRandom rng, int below) {
  if (below <= 0) return 0;
  final hi = rng.nextUint32();
  final lo = rng.nextUint32();
  final combined = (hi << 32) | lo;
  return (combined % below).toInt();
}

/// 3d6 스탯 롤
int rollStat(DeterministicRandom rng) {
  return 3 + rng.nextInt(6) + rng.nextInt(6) + rng.nextInt(6);
}

/// 캐릭터 이름 생성 (원본 NewGuy.pas 기반)
String generateName(DeterministicRandom rng) {
  const kParts = [
    'br|cr|dr|fr|gr|j|kr|l|m|n|pr||||r|sh|tr|v|wh|x|y|z',
    'a|a|e|e|i|i|o|o|u|u|ae|ie|oo|ou',
    'b|ck|d|g|k|m|n|p|t|v|x|z',
  ];

  var result = '';
  for (var i = 0; i <= 5; i++) {
    result += _pickFromPipe(kParts[i % 3], rng);
  }
  if (result.isEmpty) return result;
  return '${result[0].toUpperCase()}${result.substring(1)}';
}

/// 파이프(|)로 구분된 문자열에서 랜덤 선택
String _pickFromPipe(String pipeSeparated, DeterministicRandom rng) {
  final parts = pipeSeparated.split('|');
  if (parts.isEmpty) return '';
  final idx = rng.nextInt(parts.length);
  return parts[idx];
}
