import 'dart:convert';
import 'dart:io';

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

/// 명예의 전당 저장소 (Phase 10: Hall of Fame Storage)
///
/// 명예의 전당 데이터 저장/로드 관리
class HallOfFameStorage {
  HallOfFameStorage();

  static const String _fileName = 'hall_of_fame.json';

  Directory? _storageDir;

  Future<Directory> _getStorageDir() async {
    if (_storageDir != null) return _storageDir!;
    _storageDir = await getApplicationSupportDirectory();
    return _storageDir!;
  }

  File _getFile(Directory dir) {
    return File('${dir.path}/$_fileName');
  }

  /// 명예의 전당 로드
  Future<HallOfFame> load() async {
    try {
      final dir = await _getStorageDir();
      final file = _getFile(dir);

      if (!await file.exists()) {
        return HallOfFame.empty();
      }

      final content = await file.readAsString();
      final json = jsonDecode(content) as Map<String, dynamic>;
      return HallOfFame.fromJson(json);
    } catch (e) {
      // 파일이 없거나 손상된 경우 빈 명예의 전당 반환
      return HallOfFame.empty();
    }
  }

  /// 명예의 전당 저장
  Future<bool> save(HallOfFame hallOfFame) async {
    try {
      final dir = await _getStorageDir();
      final file = _getFile(dir);

      final content = jsonEncode(hallOfFame.toJson());
      await file.writeAsString(content);
      return true;
    } catch (e) {
      return false;
    }
  }

  /// 새 엔트리 추가 및 저장
  Future<bool> addEntry(HallOfFameEntry entry) async {
    final hallOfFame = await load();
    final updated = hallOfFame.addEntry(entry);
    return save(updated);
  }

  /// 엔트리 삭제 및 저장 (디버그용)
  Future<bool> deleteEntry(String id) async {
    final hallOfFame = await load();
    final updated = hallOfFame.removeEntry(id);
    return save(updated);
  }

  /// 명예의 전당 초기화 (테스트용)
  Future<bool> clear() async {
    try {
      final dir = await _getStorageDir();
      final file = _getFile(dir);

      if (await file.exists()) {
        await file.delete();
      }
      return true;
    } catch (e) {
      return false;
    }
  }
}
