import '../../../../../core/locator/locator.dart';
import '../../../../../core/network/api_provider_imp.dart';
import '../../../../../core/theme/frames.dart';
import '../../../../../core/theme/ranks.dart';
import '../../../domain/entities/frame.dart';

/// دادهٔ قاب‌های آواتار از backend (دریافت، خرید، انتخاب).
class FrameApiProvider {
  ApiProviderImp get _api => locator<ApiProviderImp>();

  Future<FrameCatalog> getFrames() async {
    final res = await _api.get('/frames');
    if (res.statusCode != 200) {
      throw Exception('frames: ${res.statusCode}');
    }
    final list = (res.data['frames'] as List?) ?? const [];
    final frames = list
        .map((e) => AvatarFrame.fromJson(Map<String, dynamic>.from(e as Map)))
        .toList();
    // کشِ رنگِ قاب‌ها را به‌روزرسانی کن تا HUD رنگِ درست را از سرور بگیرد.
    FrameStyles.I.setFromCatalog(
      frames.map((f) => (id: f.id, c1: f.c1, c2: f.c2)),
    );
    // کشِ رنگ/برچسبِ رتبه‌ها هم از همین پاسخ پر می‌شود.
    final tiers = (res.data['rank_tiers'] as List?) ?? const [];
    RankStyles.I.setFromCatalog(
      tiers.map((e) {
        final m = Map<String, dynamic>.from(e as Map);
        return (
          id: (m['id'] ?? '') as String,
          label: (m['label'] ?? '') as String,
          c1: (m['c1'] ?? '') as String,
          c2: (m['c2'] ?? '') as String,
        );
      }),
    );
    return FrameCatalog(frames: frames, selected: (res.data['selected'] ?? '') as String);
  }

  /// کشِ رنگِ قاب‌ها را از سرور گرم می‌کند (best-effort؛ برای رندرِ قابِ دیگران).
  Future<void> warmCache() async {
    try {
      await getFrames();
    } catch (_) {}
  }

  /// خرید؛ null یعنی موفق، وگرنه پیامِ خطای فارسی.
  Future<String?> buyFrame(String id) => _post('/shop/buy-frame', id);

  /// انتخاب؛ null یعنی موفق، وگرنه پیامِ خطای فارسی.
  Future<String?> selectFrame(String id) => _post('/shop/select-frame', id);

  Future<String?> _post(String path, String id) async {
    final res = await _api.post(path, body: {'frame_id': id});
    if (res.statusCode == 200) return null;
    switch (res.statusCode) {
      case 402:
        return 'سکهٔ کافی ندارید';
      case 403:
        return 'این قاب را ندارید';
      case 409:
        return 'این قاب را دارید';
      default:
        return 'عملیات ناموفق بود';
    }
  }
}
