import 'dart:collection';

import 'package:asciineverdie/src/core/model/game_state.dart';

/// 태스크/큐/진행 관련 함수들
/// 원본 Main.pas의 태스크 처리 로직을 포팅

/// 레벨업에 필요한 시간 (초)
int levelUpTimeSeconds(int level) {
  // Act 진행과 레벨업 동기화 (10시간 완주 목표)
  if (level <= 20) {
    // Act I: 레벨 1-20, 2시간 (7200초) → 평균 360초/레벨
    return 300 + (level * 6);
  } else if (level <= 40) {
    // Act II: 레벨 21-40, 3시간 (10800초) → 평균 540초/레벨
    return 400 + ((level - 20) * 10);
  } else if (level <= 60) {
    // Act III: 레벨 41-60, 3시간 (10800초) → 평균 540초/레벨
    return 400 + ((level - 40) * 10);
  } else if (level <= 80) {
    // Act IV: 레벨 61-80, 1.5시간 (5400초) → 평균 270초/레벨
    return 200 + ((level - 60) * 5);
  } else {
    // Act V: 레벨 81-100, 30분 (1800초) → 평균 90초/레벨
    return 60 + ((level - 80) * 3);
  }
}

/// levelUpTimeSeconds의 별칭 (호환성 유지)
int levelUpTime(int level) => levelUpTimeSeconds(level);

/// 태스크 결과
class TaskResult {
  const TaskResult({
    required this.caption,
    required this.durationMillis,
    required this.progress,
  });

  final String caption;
  final int durationMillis;
  final ProgressState progress;
}

/// 태스크 시작: 태스크 바 리셋 및 캡션 설정
TaskResult startTask(
  ProgressState progress,
  String caption,
  int durationMillis,
) {
  final updated = progress.copyWith(
    task: ProgressBarState(position: 0, max: durationMillis),
  );
  return TaskResult(
    caption: '$caption...',
    durationMillis: durationMillis,
    progress: updated,
  );
}

/// 큐 처리 결과
class DequeueResult {
  const DequeueResult({
    required this.progress,
    required this.queue,
    required this.caption,
    required this.taskType,
    required this.kind,
  });

  final ProgressState progress;
  final QueueState queue;
  final String caption;
  final TaskType taskType;
  final QueueKind kind;
}

/// 큐에서 다음 태스크 꺼내기
/// 현재 태스크가 완료되면 큐에서 다음 태스크를 가져옴
DequeueResult? dequeue(ProgressState progress, QueueState queue) {
  // 태스크 바가 완료되지 않으면 null 반환
  if (progress.task.position < progress.task.max) return null;
  if (queue.entries.isEmpty) return null;

  final entries = Queue<QueueEntry>.from(queue.entries);
  if (entries.isEmpty) return null;

  final next = entries.removeFirst();
  final taskResult = startTask(progress, next.caption, next.durationMillis);
  return DequeueResult(
    progress: taskResult.progress,
    queue: QueueState(entries: entries.toList()),
    caption: taskResult.caption,
    taskType: next.taskType,
    kind: next.kind,
  );
}
