import 'package:asciineverdie/src/core/engine/test_character_service.dart';
import 'package:asciineverdie/src/core/model/combat_stats.dart';
import 'package:asciineverdie/src/core/model/game_state.dart';
import 'package:asciineverdie/src/core/model/hall_of_fame.dart';
import 'package:asciineverdie/src/core/storage/hall_of_fame_storage.dart';
import 'package:asciineverdie/src/core/storage/save_manager.dart';
import 'package:asciineverdie/src/features/game/managers/game_statistics_manager.dart';
import 'package:flutter/foundation.dart';

/// 명예의 전당 관리를 담당하는 매니저
///
/// 게임 클리어 시 캐릭터 등록, 테스트 캐릭터 생성 등을 담당합니다.
class HallOfFameManager {
  HallOfFameManager({HallOfFameStorage? hallOfFameStorage})
    : _hallOfFameStorage = hallOfFameStorage ?? HallOfFameStorage();

  final HallOfFameStorage _hallOfFameStorage;

  /// 명예의 전당 데이터 로드
  Future<HallOfFame> load() async {
    return _hallOfFameStorage.load();
  }

  /// 명예의 전당에 캐릭터가 있는지 확인
  Future<bool> hasEntries() async {
    final hallOfFame = await _hallOfFameStorage.load();
    return hallOfFame.entries.isNotEmpty;
  }

  /// 가용 배속 목록 반환
  ///
  /// - 기본: [1] (1x만)
  /// - 명예의 전당에 캐릭터 있으면: [1, 2] (2x 해금)
  Future<List<int>> getAvailableSpeeds() async {
    final hasCharacters = await hasEntries();
    if (hasCharacters) {
      return [1, 2]; // 명예의 전당 캐릭터 있으면 2x 해금
    }
    return [1]; // 기본: 1x만
  }

  /// 명예의 전당 등록
  ///
  /// 게임 클리어 시 호출되어 캐릭터 정보를 명예의 전당에 등록합니다.
  /// 등록 성공 시 세이브 파일을 삭제합니다.
  ///
  /// Returns: 등록 성공 여부
  Future<bool> registerCharacter({
    required GameState state,
    required SaveManager saveManager,
    required GameStatisticsManager statisticsManager,
  }) async {
    try {
      debugPrint('[HallOfFame] Starting registration...');

      // 최종 전투 스탯 계산
      final combatStats = CombatStats.fromStats(
        stats: state.stats,
        equipment: state.equipment,
        level: state.traits.level,
      );

      final entry = HallOfFameEntry.fromGameState(
        state: state,
        totalDeaths: state.progress.deathCount,
        monstersKilled: state.progress.monstersKilled,
        combatStats: combatStats,
      );

      debugPrint(
        '[HallOfFame] Entry created: ${entry.characterName} Lv.${entry.level}',
      );

      final success = await _hallOfFameStorage.addEntry(entry);
      debugPrint('[HallOfFame] Storage save result: $success');

      // 통계 기록
      await statisticsManager.recordGameComplete();
      debugPrint('[HallOfFame] Registration complete');

      // 클리어된 세이브 파일 삭제 (중복 등록 방지)
      if (success) {
        final deleteResult = await saveManager.deleteSave();
        debugPrint('[HallOfFame] Save file deleted: ${deleteResult.success}');
      }

      return success;
    } catch (e, st) {
      debugPrint('[HallOfFame] ERROR: $e');
      debugPrint('[HallOfFame] StackTrace: $st');
      return false;
    }
  }

  /// 테스트 캐릭터 생성 (디버그 모드 전용)
  ///
  /// 현재 캐릭터를 레벨 100, 고급 장비, 다수의 스킬을 가진
  /// 캐릭터로 변환하여 명예의 전당에 등록하고 세이브를 삭제합니다.
  ///
  /// Returns: 등록 성공 여부
  Future<bool> createTestCharacter({
    required GameState state,
    required SaveManager saveManager,
  }) async {
    try {
      debugPrint('[TestCharacter] Creating test character...');

      // TestCharacterService로 테스트 캐릭터 생성
      final testService = TestCharacterService(rng: state.rng);
      final entry = testService.createTestCharacter(state);

      debugPrint(
        '[TestCharacter] Entry created: ${entry.characterName} Lv.${entry.level}',
      );

      // 명예의 전당에 등록
      final success = await _hallOfFameStorage.addEntry(entry);
      debugPrint('[TestCharacter] HallOfFame save result: $success');

      if (success) {
        // 세이브 파일 삭제
        final deleteResult = await saveManager.deleteSave();
        debugPrint('[TestCharacter] Save deleted: ${deleteResult.success}');
      }

      debugPrint('[TestCharacter] Complete');
      return success;
    } catch (e, st) {
      debugPrint('[TestCharacter] ERROR: $e');
      debugPrint('[TestCharacter] StackTrace: $st');
      return false;
    }
  }
}
