import 'dart:convert';
import '../../../core/services/api_service.dart';
import '../../../core/services/secure_storage_service.dart';
import 'models/user_model.dart';

class AuthRepository {
  final ApiService _apiService = ApiService();
  final SecureStorageService _secureStorage = SecureStorageService();

  // English: Perform login by email/password, verify response status, and save JWT token.
  // Arabic: إجراء تسجيل الدخول عن طريق البريد الإلكتروني وكلمة المرور، والتحقق من حالة الاستجابة، وحفظ رمز التحقق.
  Future<UserModel> login(String email, String password) async {
    final response = await _apiService.login(email, password);

    if (response.statusCode == 200) {
      final data = jsonDecode(response.body) as Map<String, dynamic>;
      final token = data['token'] as String;
      final userJson = data['user'] as Map<String, dynamic>;

      // English: Store JWT token securely using secure storage.
      // Arabic: تخزين رمز التحقق بشكل آمن باستخدام التخزين الآمن.
      await _secureStorage.writeToken(token);

      return UserModel.fromJson(userJson);
    } else {
      // English: Handle server error messages securely.
      // Arabic: معالجة رسائل خطأ الخادم بشكل آمن.
      final data = jsonDecode(response.body) as Map<String, dynamic>;
      final errorMessage = data['error'] as String? ?? 'Failed to authenticate';
      throw Exception(errorMessage);
    }
  }

  // English: Check if a valid JWT token exists and fetch the authenticated user data.
  // Arabic: التحقق من وجود رمز تحقق صالح وجلب بيانات المستخدم المصادق عليه.
  Future<UserModel?> getCachedUser() async {
    final token = await _secureStorage.readToken();
    if (token == null || token.isEmpty) {
      return null;
    }

    try {
      final response = await _apiService.getMe(token);
      if (response.statusCode == 200) {
        final data = jsonDecode(response.body) as Map<String, dynamic>;
        final userJson = data['user'] as Map<String, dynamic>;
        return UserModel.fromJson(userJson);
      } else {
        // English: Token is likely invalid or expired, clear it.
        // Arabic: من المحتمل أن يكون الرمز غير صالح أو منتهي الصلاحية، قم بمسحه.
        await _secureStorage.deleteToken();
        return null;
      }
    } catch (_) {
      // English: Return null if offline or server is unreachable.
      // Arabic: إرجاع قيمة فارغة إذا كان الجهاز غير متصل أو تعذر الوصول إلى الخادم.
      return null;
    }
  }

  // English: Clear stored JWT credentials.
  // Arabic: مسح بيانات اعتماد رمز التحقق المخزنة.
  Future<void> logout() async {
    await _secureStorage.deleteToken();
  }
}
