Respan Dataset Explorer

Select one behavior. Every returned turn has one binary label: Present or Absent. Source: final dense boolean release.

5,167,182physical rows
86shards
0.00%qualified row coverage
0.00%qualified cell coverage
Random row JSON API

turns-00080.parquet:18072

63650dd97169c16fe03e45d1
turn 1/1gpt-4.1-mini-2025-04-14EnglishSouth Korea23 words
degenerate_repetitionAbsentFinal dense release
USER
User: hi, how are you?
User: hi, how are you?
Assistant:
ASSISTANT
Hello! I'm doing well, thank you. How can I assist you today?

turns-00080.parquet:18073

6bb13fbd527d447901a855e9
turn 1/1gpt-4.1-mini-2025-04-14IndonesianUnited States18 words
degenerate_repetitionAbsentFinal dense release
USER
User: baik hati
User: baik hati
Assistant:
ASSISTANT
Terima kasih! Apakah ada yang bisa saya bantu hari ini? 😊

turns-00080.parquet:18074

445d3fff87764a2e548b8862
turn 1/1gpt-4.1-mini-2025-04-14Indonesianunknown country16 words
degenerate_repetitionAbsentFinal dense release
USER
User: mau Tanya boleh
User: mau Tanya boleh
Assistant:
ASSISTANT
Tentu, silakan! Ada yang bisa saya bantu?

turns-00080.parquet:18075

02357180b43ad275bc4604c5
turn 1/1gpt-4.1-mini-2025-04-14IndonesianJapan24 words
degenerate_repetitionAbsentFinal dense release
USER
User: yang baik hati
User: yang baik hati
Assistant:
ASSISTANT
Terima kasih! Kamu juga orang yang baik hati. Ada yang bisa saya bantu hari ini?

turns-00080.parquet:18076

ec780049e91d91909caee02f
turn 1/1gpt-4.1-mini-2025-04-14EnglishYemen6811 words
degenerate_repetitionAbsentFinal dense release
USER
لماذا هناك بطئ في الكود التالي
// main.dart
import 'dart:async';
import 'dart:convert';

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:telephony/telephony.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:flutter_contacts/flutter_contacts.dart';
import 'package:url_launcher/url_launcher.dart';

// مكتبة الاتصال التلقائي
import 'package:flutter_phone_direct_caller/flutter_phone_direct_caller.dart';

// استيراد شاشة الترحيب المنفصلة
import 'welcome_screen.dart';

const tajawalFont = 'Tajawal';
void main() => runApp(const SMSApp());

void onBackgroundMessage(SmsMessage message) {
  debugPrint("رسالة واردة في الخلفية: ${message.body}");
}

/// ألوان التطبيق المحدثة إلى أزرق جذاب
final ColorScheme lightColorScheme = ColorScheme(
  primary: Color(0xFF1565C0), // أزرق داكن أنيق
  onPrimary: Colors.white,
  primaryContainer: Color(0xFF90CAF9), // أزرق فاتح
  onPrimaryContainer: Color(0xFF0D47A1), // أزرق داكن جداً
  secondary: Color(0xFF42A5F5), // أزرق متوسط جذاب
  onSecondary: Colors.white,
  secondaryContainer: Color(0xFFE3F2FD), // أزرق فاتح جداً
  onSecondaryContainer: Color(0xFF1E88E5), // أزرق متوسط داكن
  tertiary: Color(0xFF64B5F6), // أزرق سماوي
  onTertiary: Colors.white,
  tertiaryContainer: Color(0xFFBBDEFB), // أزرق فاتح
  onTertiaryContainer: Color(0xFF1976D2), // أزرق داكن
  error: Color(0xFFD32F2F),
  onError: Colors.white,
  errorContainer: Color(0xFFFFCDD2),
  onErrorContainer: Color(0xFFB71C1C),
  background: Colors.white,
  onBackground: Color(0xFF212121), // أسود مزرق
  surface: Colors.white,
  onSurface: Color(0xFF212121),
  surfaceVariant: Color(0xFFE1F5FE), // أزرق فاتح جداً
  onSurfaceVariant: Color(0xFF0288D1), // أزرق جذاب
  outline: Color(0xFFBDBDBD),
  shadow: Colors.black54,
  inverseSurface: Color(0xFF121212),
  onInverseSurface: Colors.white,
  inversePrimary: Color(0xFF82B1FF),
  brightness: Brightness.light,
);

class SMSApp extends StatelessWidget {
  const SMSApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'حوّلها',
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        colorScheme: lightColorScheme,
        fontFamily: 'Tajawal',
        useMaterial3: true,
        appBarTheme: AppBarTheme(
          backgroundColor: Colors.transparent,
          foregroundColor: lightColorScheme.onPrimary,
          elevation: 6,
          centerTitle: true,
          titleTextStyle: const TextStyle(
            fontSize: 20,
            fontWeight: FontWeight.bold,
            letterSpacing: 0.5,
          ),
          iconTheme: IconThemeData(color: lightColorScheme.onPrimary, size: 26),
          toolbarHeight: 100,
          shadowColor: lightColorScheme.primary.withOpacity(0.4),
        ),

        cardTheme: CardTheme(
          color: lightColorScheme.surface,
          elevation: 1,
          margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),
          shape: RoundedRectangleBorder(
            borderRadius: BorderRadius.circular(16),
          ),
          surfaceTintColor: Colors.transparent,
        ),
        elevatedButtonTheme: ElevatedButtonThemeData(
          style: ElevatedButton.styleFrom(
            backgroundColor: lightColorScheme.primary,
            foregroundColor: lightColorScheme.onPrimary,
            padding: const EdgeInsets.symmetric(vertical: 16, horizontal: 24),
            shape: RoundedRectangleBorder(
              borderRadius: BorderRadius.circular(12),
            ),
            elevation: 0,
            textStyle: const TextStyle(
              fontSize: 16,
              fontWeight: FontWeight.w600,
            ),
          ),
        ),
        outlinedButtonTheme: OutlinedButtonThemeData(
          style: OutlinedButton.styleFrom(
            foregroundColor: lightColorScheme.primary,
            side: BorderSide(color: lightColorScheme.primary, width: 1.5),
            padding: const EdgeInsets.symmetric(vertical: 14, horizontal: 24),
            shape: RoundedRectangleBorder(
              borderRadius: BorderRadius.circular(12),
            ),
            textStyle: const TextStyle(
              fontSize: 16,
              fontWeight: FontWeight.w600,
            ),
          ),
        ),
        textButtonTheme: TextButtonThemeData(
          style: TextButton.styleFrom(
            foregroundColor: lightColorScheme.primary,
            textStyle: const TextStyle(
              fontWeight: FontWeight.w700,
              fontSize: 16,
            ),
          ),
        ),
        snackBarTheme: SnackBarThemeData(
          behavior: SnackBarBehavior.floating,
          backgroundColor: lightColorScheme.inverseSurface,
          elevation: 0,
          shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)),
          contentTextStyle: TextStyle(
            color: lightColorScheme.onInverseSurface,
            fontWeight: FontWeight.w500,
            fontSize: 14,
          ),
          actionTextColor: lightColorScheme.primaryContainer,
        ),
        inputDecorationTheme: InputDecorationTheme(
          filled: true,
          fillColor: lightColorScheme.surfaceVariant.withOpacity(0.4),
          contentPadding: const EdgeInsets.symmetric(
            horizontal: 16,
            vertical: 14,
          ),
          border: OutlineInputBorder(
            borderRadius: BorderRadius.circular(12),
            borderSide: BorderSide.none,
          ),
          focusedBorder: OutlineInputBorder(
            borderRadius: BorderRadius.circular(12),
            borderSide: BorderSide(color: lightColorScheme.primary, width: 2),
          ),
          errorBorder: OutlineInputBorder(
            borderRadius: BorderRadius.circular(12),
            borderSide: BorderSide(color: lightColorScheme.error, width: 1.5),
          ),
          labelStyle: TextStyle(
            color: lightColorScheme.onSurfaceVariant,
            fontWeight: FontWeight.w500,
          ),
          hintStyle: TextStyle(
            color: lightColorScheme.onSurfaceVariant.withOpacity(0.6),
          ),
          prefixIconColor: lightColorScheme.primary,
        ),
        dialogTheme: DialogTheme(
          shape: RoundedRectangleBorder(
            borderRadius: BorderRadius.circular(20),
          ),
          elevation: 0,
          backgroundColor: lightColorScheme.surface,
          contentTextStyle: TextStyle(
            color: lightColorScheme.onSurface,
            fontSize: 15,
          ),
          titleTextStyle: TextStyle(
            fontWeight: FontWeight.bold,
            fontSize: 18,
            color: lightColorScheme.onSurface,
          ),
        ),
        listTileTheme: ListTileThemeData(
          shape: RoundedRectangleBorder(
            borderRadius: BorderRadius.circular(12),
          ),
          contentPadding: const EdgeInsets.symmetric(horizontal: 16),
          iconColor: lightColorScheme.primary,
          textColor: lightColorScheme.onSurface,
          dense: true,
        ),
        chipTheme: ChipThemeData(
          backgroundColor: lightColorScheme.surfaceVariant,
          selectedColor: lightColorScheme.primary,
          secondarySelectedColor: lightColorScheme.primary,
          disabledColor: lightColorScheme.surfaceVariant.withOpacity(0.4),
          labelStyle: const TextStyle(fontWeight: FontWeight.w500),
          secondaryLabelStyle: TextStyle(color: lightColorScheme.onPrimary),
          padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 6),
          shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)),
          brightness: Brightness.light,
          side: BorderSide.none,
        ),
        dividerTheme: DividerThemeData(
          color: lightColorScheme.surfaceVariant,
          thickness: 1,
          space: 0,
        ),
        progressIndicatorTheme: ProgressIndicatorThemeData(
          color: lightColorScheme.primary,
          linearTrackColor: lightColorScheme.surfaceVariant,
        ),
        bottomSheetTheme: BottomSheetThemeData(
          backgroundColor: lightColorScheme.surface,
          shape: const RoundedRectangleBorder(
            borderRadius: BorderRadius.vertical(top: Radius.circular(20)),
          ),
          elevation: 0,
        ),
      ),
      home: const SplashScreen(),
      routes: {'/home': (context) => const SMSHomePage()},
    );
  }
}

class ThousandsSeparatorInputFormatter extends TextInputFormatter {
  @override
  TextEditingValue formatEditUpdate(
    TextEditingValue oldValue,
    TextEditingValue newValue,
  ) {
    String onlyDigits = newValue.text.replaceAll(RegExp(r'[^0-9]'), '');
    if (onlyDigits.isEmpty) return newValue.copyWith(text: '');

    final buffer = StringBuffer();
    int len = onlyDigits.length;
    for (int i = 0; i < len; i++) {
      buffer.write(onlyDigits[i]);
      int posFromRight = len - i - 1;
      if (posFromRight % 3 == 0 && i != len - 1) buffer.write(',');
    }

    return TextEditingValue(
      text: buffer.toString(),
      selection: TextSelection.collapsed(offset: buffer.length),
    );
  }
}

class TransferItem {
  String number;
  int amount;
  String? pin;

  TransferItem({required this.number, required this.amount, this.pin});

  Map<String, dynamic> toMap() {
    return {'number': number, 'amount': amount, 'pin': pin};
  }

  factory TransferItem.fromMap(Map<String, dynamic> map) {
    return TransferItem(
      number: map['number'],
      amount: map['amount'],
      pin: map['pin'],
    );
  }
}

extension ContactExtensions on Contact {
  String initials() {
    if (displayName.isEmpty) return '';

    final parts = displayName.trim().split(RegExp(r'\s+'));
    if (parts.length == 1) {
      return parts[0].substring(0, 1).toUpperCase();
    } else {
      return (parts[0].substring(0, 1) + parts[1].substring(0, 1))
          .toUpperCase();
    }
  }
}

class NumberAmount {
  String number;
  String? displayName;
  int amount;

  NumberAmount({required this.number, this.displayName, required this.amount});
}

class SMSHomePage extends StatefulWidget {
  const SMSHomePage({super.key});

  @override
  _SMSHomePageState createState() => _SMSHomePageState();
}

class _SMSHomePageState extends State<SMSHomePage>
    with WidgetsBindingObserver, TickerProviderStateMixin {
  final Telephony _telephony = Telephony.instance;
  SharedPreferences? _prefs;

  List<TransferItem> _transferList = [];
  String _selectedMethod = 'yemenMobile';
  bool _isTransferring = false;
  bool _stopTransferRequested = false;

  List<Map<String, dynamic>> _transferLogs = [];
  List<String> _savedNumbers = [];
  List<int> _savedAmounts = [];
  bool _didShowFavoritesDialog = false;
  String? _selectedQuickNumber;
  int _currentBalance = 0;

  late AnimationController _fabAnimationController;
  late Animation<double> _fabAnimation;

  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addObserver(this);
    _initApp();

    _fabAnimationController = AnimationController(
      vsync: this,
      duration: const Duration(milliseconds: 400),
    );
    _fabAnimation = CurvedAnimation(
      parent: _fabAnimationController,
      curve: Curves.easeInOutBack,
    );

    // لضمان ظهور زر التحويل دائماً
    _fabAnimationController.value = 1;
  }

  @override
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    _fabAnimationController.dispose();
    super.dispose();
  }

  Future<void> _showPinManagementDialog() async {
    // نحفظ أرقام السرية لكل طريقة في SharedPreferences باستخدام مفتاح 'pin_${method}'

    // جلب القيم المخزنة حالياً
    final yemenMobilePin = _getPinForMethod('yemenMobile') ?? '';
    final sabafonPin = _getPinForMethod('sabafon') ?? '';

    final yemenMobileController = TextEditingController(text: yemenMobilePin);
    final sabafonController = TextEditingController(text: sabafonPin);

    await showDialog(
      context: context,
      builder: (context) {
        return AlertDialog(
          title: Directionality(
            textDirection: TextDirection.rtl,
            child: Text(
              'إدارة الأرقام السرية',
              style: TextStyle(fontFamily: tajawalFont, fontSize: 15),
            ),
          ),
          content: Directionality(
            textDirection: TextDirection.rtl,
            child: SingleChildScrollView(
              child: Column(
                mainAxisSize: MainAxisSize.min,
                children: [
                  TextField(
                    controller: yemenMobileController,
                    keyboardType: TextInputType.number,
                    obscureText: true,
                    decoration: InputDecoration(
                      labelText: 'الرقم السري ليمن موبايل',
                      prefixIcon: Icon(Icons.lock_outline_rounded),
                    ),
                  ),
                  SizedBox(height: 16),
                  TextField(
                    controller: sabafonController,
                    keyboardType: TextInputType.number,
                    obscureText: true,
                    decoration: InputDecoration(
                      labelText: 'الرقم السري لسبأفون',
                      prefixIcon: Icon(Icons.lock_outline_rounded),
                    ),
                  ),
                ],
              ),
            ),
          ),
          actions: [
            Directionality(
              textDirection: TextDirection.rtl,
              child: TextButton(
                onPressed: () => Navigator.pop(context),
                child: Text('إلغاء', style: TextStyle(fontFamily: tajawalFont)),
              ),
            ),
            Directionality(
              textDirection: TextDirection.rtl,
              child: ElevatedButton(
                onPressed: () async {
                  final newYemenPin = yemenMobileController.text.trim();
                  final newSabafonPin = sabafonController.text.trim();

                  // حفظ القيم في SharedPreferences
                  await _savePinForMethod('yemenMobile', newYemenPin);
                  await _savePinForMethod('sabafon', newSabafonPin);

                  // تحديث قائمة التحويل إذا كانت تستخدم هذه الطرق:
                  setState(() {
                    for (var item in _transferList) {
                      if (item.pin != null) {
                        if (_selectedMethod == 'yemenMobile') {
                          item.pin = newYemenPin;
                        } else if (_selectedMethod == 'sabafon') {
                          item.pin = newSabafonPin;
                        }
                      }
                    }
                  });

                  Navigator.pop(context);
                  _showSnackBar('تم حفظ الأرقام السرية بنجاح');
                },
                child: Text('حفظ', style: TextStyle(fontFamily: tajawalFont)),
              ),
            ),
          ],
        );
      },
    );
  }

  Future<void> _loadTransferHistory() async {
    final prefs = await SharedPreferences.getInstance();
    final List<String>? logs = prefs.getStringList('transferHistory');
    if (logs != null && logs.isNotEmpty) {
      _transferLogs =
          logs.map((e) => json.decode(e) as Map<String, dynamic>).toList();
    } else {
      _transferLogs = [];
    }
  }

  Future<void> _saveTransferHistory() async {
    final prefs = await SharedPreferences.getInstance();
    final List<String> logs = _transferLogs.map((e) => json.encode(e)).toList();
    await prefs.setStringList('transferHistory', logs);
  }

  Future<String?> _askForPin(String method) async {
    final pinController = TextEditingController();

    return showDialog<String>(
      context: context,
      barrierDismissible: false,
      builder: (context) {
        return AlertDialog(
          title: Text(
            'الرجاء إدخال الرقم السري لطريقة التحويل: ${_getMethodName(method)}',
            style: TextStyle(fontFamily: tajawalFont),
          ),
          content: TextField(
            controller: pinController,
            keyboardType: TextInputType.number,
            obscureText: true,
            decoration: const InputDecoration(
              labelText: 'الرقم السري',
              prefixIcon: Icon(Icons.lock_outline_rounded),
            ),
          ),
          actions: [
            TextButton(
              onPressed: () => Navigator.pop(context),
              child: const Text(
                'إلغاء',
                style: TextStyle(fontFamily: tajawalFont),
              ),
            ),
            ElevatedButton(
              onPressed: () {
                final pin = pinController.text.trim();
                if (pin.isEmpty) {
                  ScaffoldMessenger.of(context).showSnackBar(
                    const SnackBar(
                      content: Text(
                        'يرجى إدخال الرقم السري',
                        style: TextStyle(fontFamily: tajawalFont),
                      ),
                    ),
                  );
                  return;
                }
                Navigator.pop(context, pin);
              },
              child: const Text('حفظ'),
            ),
          ],
        );
      },
    );
  }

  Future<void> _savePinForMethod(String method, String pin) async {
    await _prefs?.setString('pin_$method', pin);
  }

  String? _getPinForMethod(String method) {
    return _prefs?.getString('pin_$method');
  }

  Future<void> _addTransferLog(Map<String, dynamic> log) async {
    setState(() {
      _transferLogs.insert(0, log); // أدخل الأحدث في البداية
    });
    await _saveTransferHistory();
  }

  Future<void> _removeTransferLog(int index) async {
    setState(() {
      _transferLogs.removeAt(index);
    });
    await _saveTransferHistory();
  }

  Future<void> _initApp() async {
    _prefs = await SharedPreferences.getInstance();
    await _loadTransferHistory();
    _currentBalance = _prefs?.getInt('current_balance') ?? 0;

    List<String>? amountsStr = _prefs?.getStringList('savedAmounts');
    if (amountsStr != null) {
      _savedAmounts =
          amountsStr
              .map((e) => int.tryParse(e) ?? 0)
              .where((e) => e > 0)
              .toList();
    }

    if (_savedAmounts.isEmpty && !_didShowFavoritesDialog) {
      _didShowFavoritesDialog = true;
      await Future.delayed(Duration.zero);
      await _showFavoritesDialog();
    }

    List<String>? savedTransfers = _prefs?.getStringList('transferList');
    if (savedTransfers != null && savedTransfers.isNotEmpty) {
      _transferList =
          savedTransfers
              .map(
                (e) => TransferItem.fromMap(
                  json.decode(e) as Map<String, dynamic>,
                ),
              )
              .toList();
    } else {
      _transferList = [];
    }

    _selectedMethod = _prefs?.getString('selectedMethod') ?? 'yemenMobile';
    _savedNumbers = _prefs?.getStringList('savedNumbers') ?? [];

    await _requestPermissions();

    if (mounted) setState(() {});
  }

  Future<bool> _requestPermissions() async {
    final phoneStatus = await Permission.phone.status;
    final contactsStatus = await Permission.contacts.status;

    if (!phoneStatus.isGranted || !contactsStatus.isGranted) {
      final status = await [Permission.phone, Permission.contacts].request();

      if (!status[Permission.phone]!.isGranted ||
          !status[Permission.contacts]!.isGranted) {
        _showSnackBar(
          'يجب منح أذونات المكالمات وجهات الاتصال لاستخدام التطبيق',
        );
        return false;
      }
    }
    return true;
  }

  Future<void> _saveTransferList() async {
    final list = _transferList.map((e) => json.encode(e.toMap())).toList();
    await _prefs?.setStringList('transferList', list);
  }

  Future<void> _saveSelectedMethod() async {
    await _prefs?.setString('selectedMethod', _selectedMethod);
  }

  Future<void> _saveSavedNumbers() async {
    await _prefs?.setStringList('savedNumbers', _savedNumbers);
  }

  Future<void> _saveSavedAmounts() async {
    List<String> strList = _savedAmounts.map((e) => e.toString()).toList();
    await _prefs?.setStringList('savedAmounts', strList);
  }

  Future<void> _saveCurrentBalance() async {
    await _prefs?.setInt('current_balance', _currentBalance);
  }

  void _showSnackBar(String msg) {
    ScaffoldMessenger.of(context).showSnackBar(
      SnackBar(
        content: Text(
          textDirection: TextDirection.rtl,
          msg,
          style: const TextStyle(
            fontWeight: FontWeight.w500,
            fontFamily: tajawalFont,
          ),
        ),
        behavior: SnackBarBehavior.floating,
      ),
    );
  }

  Future<String?> _getContactNameFromNumber(String number) async {
    final hasPermission = await Permission.contacts.status;
    if (!hasPermission.isGranted) {
      final status = await Permission.contacts.request();
      if (!status.isGranted) return null;
    }
    final contacts = await FlutterContacts.getContacts(withProperties: true);
    for (var contact in contacts) {
      for (var phone in contact.phones) {
        final normalizedPhone = phone.number.replaceAll(RegExp(r'[^\d+]'), '');
        final normalizedNumber = number.replaceAll(RegExp(r'[^\d+]'), '');
        if (normalizedPhone == normalizedNumber) {
          return contact.displayName;
        }
      }
    }
    return null;
  }

  Future<void> _showFavoritesDialog() async {
    final amountsController = TextEditingController();

    await showDialog(
      context: context,
      barrierDismissible: false,
      builder: (context) {
        return Dialog(
          shape: RoundedRectangleBorder(
            borderRadius: BorderRadius.circular(20),
          ),
          elevation: 4,
          child: Container(
            padding: const EdgeInsets.all(24),
            decoration: BoxDecoration(
              color: Theme.of(context).colorScheme.surface,
              borderRadius: BorderRadius.circular(20),
            ),
            child: Column(
              mainAxisSize: MainAxisSize.min,
              crossAxisAlignment: CrossAxisAlignment.start,
              children: [
                Row(
                  children: [
                    Icon(
                      Icons.monetization_on_rounded,
                      color: Theme.of(context).colorScheme.primary,
                      size: 28,
                    ),
                    const SizedBox(width: 12),
                    Text(
                      'المبالغ المفضلة',
                      style: Theme.of(context).textTheme.titleLarge?.copyWith(
                        fontWeight: FontWeight.bold,
                        fontFamily: tajawalFont,
                      ),
                    ),
                  ],
                ),
                const SizedBox(height: 20),

                if (_savedAmounts.isEmpty)
                  Container(
                    padding: const EdgeInsets.all(16),
                    decoration: BoxDecoration(
                      color: Theme.of(
                        context,
                      ).colorScheme.surfaceVariant.withOpacity(0.2),
                      borderRadius: BorderRadius.circular(12),
                    ),
                    child: Text(
                      'أضف المبالغ التي تريد استخدامها بشكل متكرر',
                      style: Theme.of(
                        context,
                      ).textTheme.bodyMedium?.copyWith(fontFamily: tajawalFont),
                      textAlign: TextAlign.center,
                    ),
                  ),

                if (_savedAmounts.isNotEmpty)
                  Container(
                    constraints: const BoxConstraints(maxHeight: 150),
                    decoration: BoxDecoration(
                      borderRadius: BorderRadius.circular(12),
                      border: Border.all(
                        color: Theme.of(
                          context,
                        ).colorScheme.outline.withOpacity(0.2),
                      ),
                    ),
                    child: SingleChildScrollView(
                      child: Wrap(
                        spacing: 8,
                        runSpacing: 8,
                        children:
                            _savedAmounts
                                .map(
                                  (amt) => Chip(
                                    label: Text(
                                      _formatWithThousandsSeparator(amt),
                                      style: TextStyle(
                                        fontFamily: tajawalFont,
                                        fontWeight: FontWeight.w600,
                                        color:
                                            Theme.of(
                                              context,
                                            ).colorScheme.onPrimaryContainer,
                                      ),
                                    ),
                                    backgroundColor:
                                        Theme.of(
                                          context,
                                        ).colorScheme.primaryContainer,
                                    deleteIcon: Icon(
                                      Icons.close,
                                      size: 18,
                                      color:
                                          Theme.of(
                                            context,
                                          ).colorScheme.onPrimaryContainer,
                                    ),
                                    onDeleted: () {
                                      setState(() {
                                        _savedAmounts.remove(amt);
                                      });
                                    },
                                    shape: RoundedRectangleBorder(
                                      borderRadius: BorderRadius.circular(8),
                                    ),
                                  ),
                                )
                                .toList(),
                      ),
                    ),
                  ),

                const SizedBox(height: 20),

                TextField(
                  controller: amountsController,
                  keyboardType: TextInputType.number,
                  inputFormatters: [ThousandsSeparatorInputFormatter()],
                  decoration: InputDecoration(
                    suffixIcon: IconButton(
                      icon: Icon(
                        Icons.add_circle,
                        color: Theme.of(context).colorScheme.primary,
                        size: 28,
                      ),
                      onPressed: () {
                        final raw = amountsController.text.replaceAll(',', '');
                        final numAmount = int.tryParse(raw);
                        if (numAmount == null || numAmount <= 0) {
                          _showSnackBar('يرجى إدخال مبلغ صحيح أكبر من صفر');
                          return;
                        }
                        if (_savedAmounts.contains(numAmount)) {
                          _showSnackBar('هذا المبلغ موجود بالفعل');
                          return;
                        }
                        setState(() {
                          _savedAmounts.add(numAmount);
                          _savedAmounts.sort();
                          amountsController.clear();
                        });
                      },
                    ),
                    filled: true,
                    fillColor: Theme.of(
                      context,
                    ).colorScheme.surfaceVariant.withOpacity(0.1),
                    border: OutlineInputBorder(
                      borderRadius: BorderRadius.circular(12),
                      borderSide: BorderSide.none,
                    ),
                  ),
                  onSubmitted: (value) {
                    final raw = value.replaceAll(',', '');
                    final numAmount = int.tryParse(raw);
                    if (numAmount == null || numAmount <= 0) {
                      _showSnackBar('يرجى إدخال مبلغ صحيح أكبر من صفر');
                      return;
                    }
                    if (_savedAmounts.contains(numAmount)) {
                      _showSnackBar('هذا المبلغ موجود بالفعل');
                      return;
                    }
                    setState(() {
                      _savedAmounts.add(numAmount);
                      _savedAmounts.sort();
                      amountsController.clear();
                    });
                  },
                ),

                const SizedBox(height: 24),

                Row(
                  mainAxisAlignment: MainAxisAlignment.end,
                  children: [
                    TextButton(
                      onPressed: () => Navigator.pop(context),
                      style: TextButton.styleFrom(
                        foregroundColor:
                            Theme.of(context).colorScheme.onSurface,
                      ),
                      child: const Text(
                        'تخطي',
                        style: TextStyle(fontFamily: tajawalFont),
                      ),
                    ),
                    const SizedBox(width: 12),
                    ElevatedButton(
                      onPressed: () async {
                        if (_savedAmounts.isEmpty) {
                          _showSnackBar('الرجاء إدخال مبلغ واحد على الأقل');
                          return;
                        }
                        await _saveSavedAmounts();
                        Navigator.pop(context);
                      },
                      style: ElevatedButton.styleFrom(
                        backgroundColor: Theme.of(context).colorScheme.primary,
                        foregroundColor:
                            Theme.of(context).colorScheme.onPrimary,
                        shape: RoundedRectangleBorder(
                          borderRadius: BorderRadius.circular(12),
                        ),
                      ),
                      child: const Text(
                        'حفظ',
                        style: TextStyle(fontFamily: tajawalFont),
                      ),
                    ),
                  ],
                ),
              ],
            ),
          ),
        );
      },
    );
  }

  Future<int?> _pickAmountDialog() async {
    if (_savedAmounts.isEmpty) {
      _showSnackBar('لا توجد مبالغ محفوظة. الرجاء إضافتها في الإعدادات.');
      return null;
    }
    int? selectedAmount;

    await showModalBottomSheet(
      context: context,
      builder: (context) {
        return SafeArea(
          child: Padding(
            padding: const EdgeInsets.all(16),
            child: Wrap(
              spacing: 12,
              children:
                  _savedAmounts
                      .map(
                        (amount) => ChoiceChip(
                          label: Text(
                            _formatWithThousandsSeparator(amount),
                            style: TextStyle(
                              fontFamily: tajawalFont,
                              fontWeight: FontWeight.w600,
                              color:
                                  selectedAmount == amount
                                      ? Theme.of(context).colorScheme.onPrimary
                                      : Theme.of(context).colorScheme.primary,
                            ),
                          ),
                          selected: selectedAmount == amount,
                          onSelected: (_) {
                            selectedAmount = amount;
                            Navigator.pop(context);
                          },
                        ),
                      )
                      .toList(),
            ),
          ),
        );
      },
    );

    return selectedAmount;
  }

  Future<void> _showSavedNumbersSelection() async {
    final hasPermission = await _requestPermissions();
    if (!hasPermission) return;

    final contacts = await FlutterContacts.getContacts(
      withProperties: true,
      withThumbnail: false,
    );
    final selectedNumbers = List<String>.from(_savedNumbers);

    final searchController = TextEditingController();
    var searchQuery = '';

    await showModalBottomSheet<void>(
      context: context,
      isScrollControlled: true,
      backgroundColor: Colors.transparent,
      builder: (context) {
        return Directionality(
          textDirection: TextDirection.rtl, // هذا السطر يجعل كل المحتوى RTL
          child: StatefulBuilder(
            builder: (context, setModal) {
              final filteredContacts = _filterContacts(contacts, searchQuery);

              return Container(
                height: MediaQuery.of(context).size.height * 0.9,
                decoration: BoxDecoration(
                  color: Theme.of(context).colorScheme.surface,
                  borderRadius: const BorderRadius.vertical(
                    top: Radius.circular(24),
                  ),
                ),
                padding: EdgeInsets.only(
                  bottom: MediaQuery.of(context).viewInsets.bottom,
                ),
                child: Column(
                  children: [
                    // Header with search and title
                    Padding(
                      padding: const EdgeInsets.fromLTRB(16, 16, 16, 8),
                      child: Row(
                        textDirection:
                            TextDirection.rtl, // تأكيد اتجاه النص للرأس
                        children: [
                          IconButton(
                            icon: Icon(
                              Icons.close_rounded,
                              color: Theme.of(context).colorScheme.onSurface,
                            ),
                            onPressed: () => Navigator.pop(context),
                            tooltip: 'إغلاق',
                          ),
                          const SizedBox(width: 5),
                          Expanded(
                            child: Padding(
                              padding: const EdgeInsets.only(
                                left: 30,
                              ), // تحريك النص 10 بيكسل إلى اليمين
                              child: Text(
                                'اختر الأرقام المحفوظة',
                                textAlign: TextAlign.center,
                                style: Theme.of(
                                  context,
                                ).textTheme.titleLarge?.copyWith(
                                  fontSize: 17,
                                  fontFamily: tajawalFont,
                                  fontWeight: FontWeight.bold,
                                ),
                              ),
                            ),
                          ),
                        ],
                      ),
                    ),

                    // Search bar
                    Padding(
                      padding: const EdgeInsets.symmetric(
                        horizontal: 16,
                        vertical: 8,
                      ),
                      child: TextField(
                        textAlign: TextAlign.right, // محاذاة نص البحث لليمين
                        controller: searchController,
                        decoration: InputDecoration(
                          suffixIcon: const Icon(
                            Icons.search,
                          ), // تغيير الأيقونة للجانب الأيمن
                          hintText: 'ابحث في جهات الاتصال أو الأرقام',
                          isDense: true,
                          filled: true,
                          fillColor: Colors.grey[100],
                          border: OutlineInputBorder(
                            borderRadius: BorderRadius.circular(50),
                            borderSide: BorderSide.none,
                          ),
                          contentPadding: const EdgeInsets.symmetric(
                            vertical: 12,
                            horizontal: 16,
                          ),
                        ),
                        onChanged: (value) {
                          setModal(() {
                            searchQuery = value.trim();
                          });
                        },
                      ),
                    ),

                    const SizedBox(height: 8),

                    // Contacts count
                    Padding(
                      padding: const EdgeInsets.symmetric(horizontal: 16),
                      child: Row(
                        textDirection: TextDirection.rtl,
                        children: [
                          Text(
                            '${filteredContacts.length} جهة اتصال',
                            style: Theme.of(
                              context,
                            ).textTheme.bodySmall?.copyWith(
                              fontFamily: tajawalFont,
                              color:
                                  Theme.of(
                                    context,
                                  ).colorScheme.onSurfaceVariant,
                            ),
                          ),
                          const Spacer(),
                          Text(
                            '${selectedNumbers.length} مختارة',
                            style: Theme.of(
                              context,
                            ).textTheme.bodySmall?.copyWith(
                              fontFamily: tajawalFont,
                              color: Theme.of(context).colorScheme.primary,
                            ),
                          ),
                        ],
                      ),
                    ),

                    const Divider(height: 24, thickness: 1),

                    // Contacts list
                    Expanded(
                      child:
                          filteredContacts.isEmpty
                              ? _buildEmptyState(context)
                              : _buildContactsList(
                                context,
                                filteredContacts,
                                selectedNumbers,
                                setModal,
                              ),
                    ),

                    // Bottom buttons
                    _buildBottomButtons(context, selectedNumbers, setModal),
                  ],
                ),
              );
            },
          ),
        );
      },
    );
  }

  // دالة مساعدة لتصفية جهات الاتصال
  List<Contact> _filterContacts(List<Contact> contacts, String query) {
    if (query.isEmpty) return contacts;

    return contacts.where((contact) {
      final contactNameLower = contact.displayName.toLowerCase();
      final queryLower = query.toLowerCase();

      final phonesMatch = contact.phones.any(
        (phone) => phone.number.toLowerCase().contains(queryLower),
      );

      return contactNameLower.contains(queryLower) || phonesMatch;
    }).toList();
  }

  // بناء واجهة الحالة الفارغة
  Widget _buildEmptyState(BuildContext context) {
    return Center(
      child: Column(
        mainAxisSize: MainAxisSize.min,
        children: [
          Icon(
            Icons.contact_phone_outlined,
            size: 48,
            color: Theme.of(context).colorScheme.outline,
          ),
          const SizedBox(height: 16),
          Text(
            'لا توجد جهات اتصال تطابق البحث',
            textAlign: TextAlign.right,
            style: Theme.of(context).textTheme.bodyMedium?.copyWith(
              fontFamily: tajawalFont,
              color: Theme.of(context).colorScheme.onSurfaceVariant,
            ),
          ),
        ],
      ),
    );
  }

  // بناء قائمة جهات الاتصال
  Widget _buildContactsList(
    BuildContext context,
    List<Contact> contacts,
    List<String> selectedNumbers,
    StateSetter setModal,
  ) {
    return ListView.separated(
      keyboardDismissBehavior: ScrollViewKeyboardDismissBehavior.onDrag,
      physics: const ClampingScrollPhysics(),
      itemCount: contacts.length,
      separatorBuilder: (_, __) => const Divider(height: 1, indent: 72),
      itemBuilder: (context, index) {
        final contact = contacts[index];
        final phones = contact.phones;

        return Material(
          color: Colors.transparent,
          child: InkWell(
            onTap:
                () => _toggleContactSelection(
                  phones.first.number,
                  selectedNumbers,
                  setModal,
                ),
            child: Padding(
              padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12),
              child: Row(
                textDirection: TextDirection.rtl, // اتجاه الصف من اليمين لليسار
                children: [
                  // Contact avatar
                  _buildContactAvatar(
                    context,
                    contact,
                    selectedNumbers,
                    phones,
                  ),
                  const SizedBox(width: 16),
                  // Contact info
                  _buildContactInfo(context, contact, phones),
                ],
              ),
            ),
          ),
        );
      },
    );
  }

  // بناء صورة جهة الاتصال
  Widget _buildContactAvatar(
    BuildContext context,
    Contact contact,
    List<String> selectedNumbers,
    List<Phone> phones,
  ) {
    return Stack(
      children: [
        CircleAvatar(
          radius: 24,
          backgroundImage:
              (contact.thumbnail != null && contact.thumbnail!.isNotEmpty)
                  ? ResizeImage(
                    MemoryImage(contact.thumbnail!),
                    width: 48,
                    height: 48,
                  )
                  : null,
          child:
              (contact.thumbnail == null || contact.thumbnail!.isEmpty)
                  ? Text(
                    contact.initials(),
                    style: const TextStyle(
                      fontFamily: tajawalFont,
                      fontWeight: FontWeight.bold,
                      color: Colors.white,
                      fontSize: 18,
                    ),
                  )
                  : null,
          backgroundColor: Theme.of(context).colorScheme.primary,
        ),
        if (_isContactSelected(phones, selectedNumbers))
          Positioned(
            left: 0, // تغيير الموضع لليسار بدلاً من اليمين
            bottom: 0,
            child: Container(
              padding: const EdgeInsets.all(4),
              decoration: BoxDecoration(
                color: Colors.green,
                shape: BoxShape.circle,
                border: Border.all(
                  color: Theme.of(context).colorScheme.surface,
                  width: 2,
                ),
              ),
              child: const Icon(Icons.check, size: 14, color: Colors.white),
            ),
          ),
      ],
    );
  }

  // بناء معلومات جهة الاتصال
  Widget _buildContactInfo(
    BuildContext context,
    Contact contact,
    List<Phone> phones,
  ) {
    return Expanded(
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.start, // محاذاة النص لليمين
        children: [
          Text(
            contact.displayName,
            textAlign: TextAlign.right,
            style: const TextStyle(
              fontFamily: tajawalFont,
              fontSize: 16,
              fontWeight: FontWeight.w600,
            ),
            maxLines: 1,
            overflow: TextOverflow.ellipsis,
          ),
          const SizedBox(height: 4),
          ...phones.map(
            (phone) => Text(
              phone.number,
              textAlign: TextAlign.right,
              style: TextStyle(
                fontFamily: tajawalFont,
                fontSize: 14,
                color: Theme.of(context).colorScheme.onSurfaceVariant,
              ),
            ),
          ),
        ],
      ),
    );
  }

  // بناء أزرار القاع
  Widget _buildBottomButtons(
    BuildContext context,
    List<String> selectedNumbers,
    StateSetter setModal,
  ) {
    return Container(
      padding: const EdgeInsets.all(16),
      decoration: BoxDecoration(
        color: Theme.of(context).colorScheme.surface,
        boxShadow: [
          BoxShadow(
            color: Colors.black.withOpacity(0.1),
            blurRadius: 8,
            offset: const Offset(0, -4),
          ),
        ],
      ),
      child: Row(
        textDirection: TextDirection.ltr, // اتجاه الصف من اليمين لليسار
        children: [
          Expanded(
            child: OutlinedButton(
              style: OutlinedButton.styleFrom(
                padding: const EdgeInsets.symmetric(vertical: 16),
                shape: RoundedRectangleBorder(
                  borderRadius: BorderRadius.circular(12),
                ),
              ),
              onPressed: () => Navigator.pop(context),
              child: const Text(
                'إلغاء',
                style: TextStyle(fontFamily: tajawalFont),
              ),
            ),
          ),
          const SizedBox(width: 12),
          Expanded(
            child: FilledButton(
              style: FilledButton.styleFrom(
                padding: const EdgeInsets.symmetric(vertical: 16),
                shape: RoundedRectangleBorder(
                  borderRadius: BorderRadius.circular(12),
                ),
                backgroundColor: Theme.of(context).colorScheme.primary,
              ),
              onPressed: () async {
                _savedNumbers = List.from(selectedNumbers);
                await _saveSavedNumbers();
                if (!mounted) return;
                setState(() {});
                Navigator.pop(context);
                _showSnackBar('تم حفظ الأرقام المختارة');
              },
              child: const Text(
                'تأكيد',
                style: TextStyle(
                  fontFamily: tajawalFont,
                  fontWeight: FontWeight.bold,
                ),
              ),
            ),
          ),
        ],
      ),
    );
  }

  // تبديل اختيار جهة الاتصال
  void _toggleContactSelection(
    String phoneNumber,
    List<String> selectedNumbers,
    StateSetter setModal,
  ) {
    final normalized = phoneNumber.replaceAll(RegExp(r'[^\d+]'), '');

    setModal(() {
      if (selectedNumbers.any((num) {
        final n = num.replaceAll(RegExp(r'[^\d+]'), '');
        return n == normalized;
      })) {
        selectedNumbers.removeWhere((num) {
          final n = num.replaceAll(RegExp(r'[^\d+]'), '');
          return n == normalized;
        });
      } else {
        selectedNumbers.add(normalized);
      }
    });
  }

  // التحقق مما إذا كانت جهة الاتصال مختارة
  bool _isContactSelected(List<Phone> phones, List<String> selectedNumbers) {
    return phones.any((phone) {
      final normalized = phone.number.replaceAll(RegExp(r'[^\d+]'), '');
      return selectedNumbers.any((num) {
        final n = num.replaceAll(RegExp(r'[^\d+]'), '');
        return n == normalized;
      });
    });
  }

  Future<void> _showBatchAmountAssignmentDialog(List<String> numbers) async {
    if (numbers.isEmpty) {
      _showSnackBar('لا توجد أرقام لتحديثها');
      return;
    }
    if (_savedAmounts.isEmpty) {
      _showSnackBar('لا توجد مبالغ محفوظة. الرجاء إضافتها في الإعدادات.');
      return;
    }

    List<NumberAmount> tempList = [];
    for (var number in numbers) {
      String? name = await _getContactNameFromNumber(number);
      final existing = _transferList.firstWhere(
        (element) => element.number == number,
        orElse: () => TransferItem(number: number, amount: 0),
      );
      tempList.add(
        NumberAmount(
          number: number,
          displayName: name,
          amount: existing.amount > 0 ? existing.amount : 0,
        ),
      );
    }

    final formKey = GlobalKey<FormState>();

    await showDialog(
      context: context,
      builder: (context) {
        return AlertDialog(
          title: const Text(
            'تعيين مبلغ لكل رقم',
            style: TextStyle(fontFamily: tajawalFont),
          ),
          content: StatefulBuilder(
            builder: (context, setDialogState) {
              return Form(
                key: formKey,
                child: SizedBox(
                  width: double.maxFinite,
                  child: ListView.separated(
                    shrinkWrap: true,
                    physics: const ClampingScrollPhysics(),
                    separatorBuilder: (_, __) => const SizedBox(height: 16),
                    itemCount: tempList.length,
                    itemBuilder: (context, index) {
                      final item = tempList[index];
                      return Column(
                        crossAxisAlignment: CrossAxisAlignment.start,
                        children: [
                          Text(
                            item.displayName ?? item.number,
                            style: const TextStyle(
                              fontFamily: tajawalFont,
                              fontWeight: FontWeight.w600,
                              fontSize: 16,
                            ),
                            overflow: TextOverflow.ellipsis,
                          ),
                          const SizedBox(height: 8),
                          DropdownButtonFormField<int>(
                            decoration: const InputDecoration(
                              labelText: 'المبلغ',
                              isDense: true,
                            ),
                            items:
                                _savedAmounts
                                    .map(
                                      (e) => DropdownMenuItem(
                                        value: e,
                                        child: Text(
                                          _formatWithThousandsSeparator(e),
                                          style: const TextStyle(
                                            fontFamily: tajawalFont,
                                            fontWeight: FontWeight.w600,
                                          ),
                                        ),
                                      ),
                                    )
                                    .toList(),
                            value: item.amount > 0 ? item.amount : null,
                            onChanged: (val) {
                              setDialogState(() {
                                item.amount = val ?? 0;
                              });
                            },
                            validator: (val) {
                              if (val == null || val <= 0) {
                                return 'يرجى اختيار مبلغ صالح';
                              }
                              return null;
                            },
                            isExpanded: true,
                          ),
                        ],
                      );
                    },
                  ),
                ),
              );
            },
          ),
          actions: [
            TextButton(
              onPressed: () => Navigator.pop(context),
              child: const Text(
                'إلغاء',
                style: TextStyle(fontFamily: tajawalFont),
              ),
            ),
            FilledButton(
              onPressed: () async {
                if (!formKey.currentState!.validate()) {
                  _showSnackBar('يرجى إدخال جميع المبالغ بشكل صحيح');
                  return;
                }
                for (var item in tempList) {
                  if (!_transferList.any((e) => e.number == item.number)) {
                    String? pinForCurrentMethod = _getPinForMethod(
                      _selectedMethod,
                    );
                    _transferList.add(
                      TransferItem(
                        number: item.number,
                        amount: item.amount,
                        pin:
                            (_selectedMethod == 'yemenMobile' ||
                                    _selectedMethod == 'sabafon')
                                ? ''
                                : null,
                      ),
                    );
                  } else {
                    final existingIndex = _transferList.indexWhere(
                      (e) => e.number == item.number,
                    );
                    if (existingIndex != -1) {
                      _transferList[existingIndex].amount = item.amount;
                      if (_selectedMethod == 'yemenMobile' ||
                          _selectedMethod == 'sabafon') {
                        _transferList[existingIndex].pin ??= '';
                      } else {
                        _transferList[existingIndex].pin = null;
                      }
                    }
                  }
                }
                await _saveTransferList();
                setState(() {});
                Navigator.pop(context);
                _showSnackBar('تم تحديث قائمة التحويل بالمبالغ المحددة');
              },
              child: const Text(
                'حفظ',
                style: TextStyle(fontFamily: tajawalFont),
              ),
            ),
          ],
        );
      },
    );
  }

  String _formatWithThousandsSeparator(int value) {
    final s = value.toString();
    final buffer = StringBuffer();
    int len = s.length;
    for (int i = 0; i < len; i++) {
      buffer.write(s[i]);
      int posFromRight = len - i - 1;
      if (posFromRight % 3 == 0 && i != len - 1) {
        buffer.write(',');
      }
    }
    return buffer.toString();
  }

  // **التعديل الرئيسي: استخدام flutter_phone_direct_caller للاتصال التلقائي**
  Future<void> _startTransferSequence() async {
    if (_transferList.isEmpty) {
      _showSnackBar("لاتوجد عمليات للتحويل");
      return;
    }

    if (_selectedMethod == 'yemenMobile' || _selectedMethod == 'sabafon') {
      String? savedPin = _getPinForMethod(_selectedMethod);

      if (savedPin == null || savedPin.isEmpty) {
        String? pin = await _askForPin(_selectedMethod);
        if (pin == null || pin.isEmpty) {
          _showSnackBar('الرجاء إدخال الرقم السري لإجراء التحويل');
          setState(() {
            _isTransferring = false;
          });
          return;
        }
        savedPin = pin;
        await _savePinForMethod(_selectedMethod, pin);
      }

      // تحديث جميع العمليات بقيمة PIN
      setState(() {
        for (var item in _transferList) {
          item.pin = savedPin;
        }
      });
    }

    int totalAmount = _transferList.fold(0, (sum, item) => sum + item.amount);
    if (totalAmount > _currentBalance) {
      _showSnackBar(
        "الرصيد الحالي (${_formatWithThousandsSeparator(_currentBalance)}) غير كافٍ لإجراء التحويلات (المجموع: ${_formatWithThousandsSeparator(totalAmount)})",
      );
      return;
    }

    // طلب إذن الاتصال CALL_PHONE
    if (!await Permission.phone.isGranted) {
      final status = await Permission.phone.request();
      if (!status.isGranted) {
        _showSnackBar("يجب منح إذن الاتصال لإجراء تحويل الرصيد");
        return;
      }
    }

    final phonePermissionStatus = await Permission.phone.status;
    if (!phonePermissionStatus.isGranted) {
      final status = await Permission.phone.request();
      if (!status.isGranted) {
        _showSnackBar("يجب منح إذن الاتصال لإجراء تحويل الرصيد");
        return;
      }
    }

    setState(() {
      _isTransferring = true;
      _stopTransferRequested = false;
    });
    await _fabAnimationController.forward().orCancel;

    _transferLogs.clear();

    List<TransferItem> tempTransferList = List.from(_transferList);
    List<String> successfullyTransferredNumbers = [];

    for (var i = 0; i < tempTransferList.length; i++) {
      if (_stopTransferRequested) {
        _showSnackBar("تم إيقاف عملية التحويل");
        break;
      }

      var item = tempTransferList[i];
      String ussdCode = _buildUssdCode(item);

      _showSnackBar(
        'جاري تحويل ${_getMethodName(_selectedMethod)}: ${_formatWithThousandsSeparator(item.amount)} إلى ${item.number} (${i + 1}/${tempTransferList.length})',
      );

      try {
        debugPrint("Calling USSD code: $ussdCode");
        bool? called = await FlutterPhoneDirectCaller.callNumber(ussdCode);
        if (called == true) {
          await _addTransferLog({
            'number': item.number,
            'amount': item.amount,
            'success': true,
            'method': _selectedMethod,
            'timestamp': DateTime.now().toIso8601String(),
          });
          successfullyTransferredNumbers.add(item.number);

          setState(() {
            _currentBalance -= item.amount;
          });
          await _saveCurrentBalance();

          await Future.delayed(const Duration(seconds: 10));
        } else {
          await _addTransferLog({
            'number': item.number,
            'amount': item.amount,
            'success': true,
            'method': _selectedMethod,
            'timestamp': DateTime.now().toIso8601String(),
          });
        }
      } catch (e) {
        await _addTransferLog({
          'number': item.number,
          'amount': item.amount,
          'success': true,
          'method': _selectedMethod,
          'timestamp': DateTime.now().toIso8601String(),
        });
      }
    }

    setState(() {
      for (var number in successfullyTransferredNumbers) {
        _transferList.removeWhere((t) => t.number == number);
        _savedNumbers.removeWhere(
          (num) => _normalizeNumber(num) == _normalizeNumber(number),
        );
        if (_selectedQuickNumber == number) _selectedQuickNumber = null;
      }
    });

    await _saveTransferList();
    await _saveSavedNumbers();

    setState(() {
      _isTransferring = false;
    });
    await _fabAnimationController.reverse().orCancel;

    if (!_stopTransferRequested) {
      _showSnackBar("تمت جميع عمليات التحويل");
    }
    _fabAnimationController.value = 1;
  }

  String _normalizeNumber(String number) {
    return number.replaceAll(RegExp(r'[^\d+]'), '');
  }

  String _getMethodName(String method) {
    switch (method) {
      case 'yemenMobile':
        return 'يمن موبايل';
      case 'y':
        return 'واي';
      case 'sabafon':
        return 'سبأفون';
      case 'you':
        return 'يو';
      default:
        return method;
    }
  }

  String _buildUssdCode(TransferItem item) {
    final number = item.number;
    final amount = item.amount.toString();
    final pin = item.pin ?? '';

    String code = '';

    switch (_selectedMethod) {
      case 'yemenMobile':
        if (pin.isEmpty) {
          // إذا PIN فارغ، رمز بدون PIN
          code = '*888*$amount*$number#';
        } else {
          code = '*888*$amount*$number*$pin#';
        }
        break;
      case 'sabafon':
        if (pin.isEmpty) {
          code = '*123*$number*$amount#';
        } else {
          code = '*123*$pin*$number*$amount#';
        }
        break;
      case 'y':
        code = '*109*$amount*$number#';
        break;
      case 'you':
        code = '*130*$number*$amount#';
        break;
      default:
        code = '';
    }

    return code.replaceAll('#', Uri.encodeComponent('#'));
  }

  void _showTransferLogsDialog() {
    showDialog(
      context: context,
      builder: (context) {
        return AlertDialog(
          title: const Text(
            'سجل عمليات التحويل',
            textAlign: TextAlign.right,
            style: TextStyle(fontFamily: tajawalFont),
          ),

          content: SizedBox(
            width: double.maxFinite,
            child:
                _transferLogs.isEmpty
                    ? Center(
                      child: Text(
                        'لا توجد عمليات تحويل حتى الآن',
                        style: Theme.of(context).textTheme.bodyMedium?.copyWith(
                          fontFamily: tajawalFont,
                          color: Theme.of(context).colorScheme.onSurfaceVariant,
                        ),
                      ),
                    )
                    : Directionality(
                      textDirection: TextDirection.rtl,
                      child: ListView.builder(
                        shrinkWrap: true,
                        physics: const ClampingScrollPhysics(),
                        itemCount: _transferLogs.length,
                        itemBuilder: (_, i) {
                          final log = _transferLogs[i];
                          final success = log['success'] as bool;
                          final timestamp =
                              log['timestamp'] != null
                                  ? DateTime.parse(log['timestamp'])
                                  : null;
                          final timeFormatted =
                              timestamp != null
                                  ? '${timestamp.year}-${timestamp.month.toString().padLeft(2, '0')}-${timestamp.day.toString().padLeft(2, '0')} ${timestamp.hour.toString().padLeft(2, '0')}:${timestamp.minute.toString().padLeft(2, '0')}'
                                  : '';

                          return ListTile(
                            contentPadding: EdgeInsets.zero,
                            leading: Container(
                              width: 36,
                              height: 36,
                              decoration: BoxDecoration(
                                color:
                                    success
                                        ? Theme.of(
                                          context,
                                        ).colorScheme.primaryContainer
                                        : Theme.of(
                                          context,
                                        ).colorScheme.errorContainer,
                                shape: BoxShape.circle,
                              ),
                              child: Icon(
                                success ? Icons.check : Icons.close,
                                color:
                                    success
                                        ? Theme.of(context).colorScheme.primary
                                        : Theme.of(context).colorScheme.error,
                              ),
                            ),
                            title: Text(
                              '${_getMethodName(log['method'])} - ${log['number']}',
                              style: const TextStyle(
                                fontWeight: FontWeight.w600,
                                fontFamily: tajawalFont,
                              ),
                            ),
                            subtitle: Column(
                              crossAxisAlignment: CrossAxisAlignment.start,
                              children: [
                                Text(
                                  'المبلغ: ${_formatWithThousandsSeparator(log['amount'] ?? 0)}',
                                  style: TextStyle(fontFamily: tajawalFont),
                                ),
                                if (timeFormatted.isNotEmpty)
                                  Text(
                                    'الوقت: $timeFormatted',
                                    style: const TextStyle(
                                      fontFamily: tajawalFont,
                                      fontSize: 12,
                                      color: Colors.grey,
                                    ),
                                  ),
                                if (log['error'] != null)
                                  Text(
                                    'خطأ: ${log['error']}',
                                    style: const TextStyle(
                                      fontFamily: tajawalFont,
                                      fontSize: 12,
                                      color: Colors.red,
                                    ),
                                  ),
                              ],
                            ),
                            trailing: IconButton(
                              icon: Icon(
                                Icons.delete_forever_rounded,
                                color: Theme.of(context).colorScheme.error,
                              ),
                              tooltip: 'حذف السجل',
                              onPressed: () {
                                _removeTransferLog(i);
                                Navigator.pop(context);
                                Future.delayed(
                                  Duration(milliseconds: 100),
                                  _showTransferLogsDialog,
                                );
                              },
                            ),
                          );
                        },
                      ),
                    ),
          ),
          actions: [
            TextButton(
              onPressed: () => Navigator.pop(context),
              child: const Text(
                'إغلاق',
                style: TextStyle(fontFamily: tajawalFont),
              ),
            ),
            TextButton(
              onPressed: () {
                setState(() {
                  _transferLogs.clear();
                });
                _saveTransferHistory();
                Navigator.pop(context);
                _showSnackBar('تم حذف جميع سجلات التحويل');
              },
              child: const Text(
                'حذف الكل',
                style: TextStyle(fontFamily: tajawalFont),
              ),
            ),
          ],
        );
      },
    );
  }

  void _showAmountsManagementDialog() async {
    final amountsController = TextEditingController();
    bool isValidInput(String value) {
      final raw = value.replaceAll(',', '');
      final numAmount = int.tryParse(raw);
      return numAmount != null &&
          numAmount > 0 &&
          !_savedAmounts.contains(numAmount);
    }

    void addAmount(
      String value,
      void Function(void Function()) setDialogState,
    ) {
      final raw = value.replaceAll(',', '');
      final numAmount = int.tryParse(raw);
      if (numAmount == null || numAmount <= 0) {
        _showSnackBar('يرجى إدخال مبلغ صحيح أكبر من صفر');
        return;
      }
      if (_savedAmounts.contains(numAmount)) {
        _showSnackBar('هذا المبلغ موجود بالفعل');
        return;
      }
      setDialogState(() {
        _savedAmounts.add(numAmount);
        _savedAmounts.sort();
        amountsController.clear();
      });
    }

    await showDialog(
      context: context,
      builder: (context) {
        return AlertDialog(
          title: const Text(
            'إدارة المبالغ المحفوظة',
            style: TextStyle(fontFamily: tajawalFont),
            textAlign: TextAlign.center,
          ),
          content: StatefulBuilder(
            builder: (context, setDialogState) {
              return SizedBox(
                width: double.maxFinite,
                child: Column(
                  mainAxisSize: MainAxisSize.min,
                  children: [
                    if (_savedAmounts.isEmpty)
                      Padding(
                        padding: const EdgeInsets.symmetric(vertical: 12),
                        child: Text(
                          'لا توجد مبالغ محفوظة حالياً',
                          style: Theme.of(
                            context,
                          ).textTheme.bodyMedium?.copyWith(
                            fontFamily: tajawalFont,
                            color:
                                Theme.of(context).colorScheme.onSurfaceVariant,
                          ),
                        ),
                      ),
                    if (_savedAmounts.isNotEmpty)
                      Container(
                        constraints: BoxConstraints(maxHeight: 150),
                        child: SingleChildScrollView(
                          child: Wrap(
                            spacing: 8,
                            runSpacing: 6,
                            children:
                                _savedAmounts
                                    .map(
                                      (amt) => Tooltip(
                                        message: 'حذف هذا المبلغ',
                                        child: Chip(
                                          label: Text(
                                            _formatWithThousandsSeparator(amt),
                                            style: const TextStyle(
                                              fontFamily: tajawalFont,
                                              fontWeight: FontWeight.w600,
                                            ),
                                          ),
                                          backgroundColor:
                                              Theme.of(
                                                context,
                                              ).colorScheme.primaryContainer,
                                          shape: RoundedRectangleBorder(
                                            borderRadius: BorderRadius.circular(
                                              20,
                                            ),
                                          ),
                                          onDeleted: () {
                                            setDialogState(() {
                                              _savedAmounts.remove(amt);
                                            });
                                          },
                                          deleteIconColor:
                                              Theme.of(
                                                context,
                                              ).colorScheme.error,
                                        ),
                                      ),
                                    )
                                    .toList(),
                          ),
                        ),
                      ),
                    const Divider(height: 25, thickness: 1),
                    TextField(
                      controller: amountsController,
                      keyboardType: TextInputType.number,
                      inputFormatters: [ThousandsSeparatorInputFormatter()],
                      decoration: InputDecoration(
                        labelText: 'إضافة مبلغ جديد',
                        suffixIcon: IconButton(
                          icon: const Icon(Icons.add_circle_rounded),
                          tooltip: 'إضافة المبلغ',
                          onPressed:
                              isValidInput(amountsController.text)
                                  ? () => addAmount(
                                    amountsController.text,
                                    setDialogState,
                                  )
                                  : null,
                        ),
                      ),
                      onChanged: (value) {
                        setDialogState(() {}); // لتحديث زر الإضافة
                      },
                      onSubmitted: (value) {
                        addAmount(value, setDialogState);
                      },
                    ),
                  ],
                ),
              );
            },
          ),
          actionsAlignment: MainAxisAlignment.spaceBetween,
          actions: [
            TextButton(
              onPressed: () => Navigator.pop(context),
              child: const Text(
                'إغلاق',
                style: TextStyle(fontFamily: tajawalFont),
              ),
            ),
            FilledButton.tonal(
              onPressed: () async {
                await _saveSavedAmounts();
                Navigator.pop(context);
                _showSnackBar('تم حفظ المبالغ بنجاح');
              },
              child: const Text(
                'حفظ',
                style: TextStyle(fontFamily: tajawalFont),
              ),
            ),
          ],
        );
      },
    );
  }

  void _stopTransferSequence() {
    if (_isTransferring) {
      setState(() {
        _stopTransferRequested = true;
      });
      _showSnackBar("تم طلب إيقاف عملية التحويل");
    }
  }

  Widget _buildCurrentTransferMethodSection() {
    final methodNames = {
      'yemenMobile': 'يمن موبايل',
      'y': 'واي',
      'sabafon': 'سبأفون',
      'you': 'يو',
    };

    final methodIcons = {
      'yemenMobile': Icons.sim_card,
      'y': Icons.sim_card,
      'sabafon': Icons.sim_card,
      'you': Icons.sim_card,
    };

    final methodName = methodNames[_selectedMethod] ?? _selectedMethod;
    final methodIcon = methodIcons[_selectedMethod] ?? Icons.sync;

    return Card(
      margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),
      child: Padding(
        padding: const EdgeInsets.all(16),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Row(
              mainAxisAlignment: MainAxisAlignment.spaceBetween,
              children: [
                Icon(
                  Icons.swap_horiz,
                  color: Theme.of(context).colorScheme.primary,
                ),
                const SizedBox(width: 12),
                Text(
                  'طريقة التحويل الحالية',
                  style: Theme.of(context).textTheme.titleLarge?.copyWith(
                    fontFamily: tajawalFont,
                    fontWeight: FontWeight.bold,
                  ),
                ),
              ],
            ),
            const SizedBox(height: 16),
            Row(
              children: [
                Container(
                  decoration: BoxDecoration(
                    color: Colors.lightBlue[50],
                    borderRadius: BorderRadius.circular(12),
                  ),
                  padding: const EdgeInsets.all(12),
                  child: Icon(
                    methodIcon,
                    size: 40,
                    color: Theme.of(context).colorScheme.primary,
                  ),
                ),
                const SizedBox(width: 16),
                Expanded(
                  child: Text(
                    methodName,
                    style: Theme.of(context).textTheme.headlineSmall?.copyWith(
                      fontFamily: tajawalFont,
                      fontWeight: FontWeight.bold,
                      color: Theme.of(context).colorScheme.primary,
                    ),
                  ),
                ),
                FilledButton.tonal(
                  onPressed: () async {
                    final selected = await showDialog<String>(
                      context: context,
                      builder: (context) {
                        return SimpleDialog(
                          title: const Text(
                            'اختر طريقة التحويل',
                            style: TextStyle(fontFamily: tajawalFont),
                          ),
                          children:
                              methodNames.entries.map((entry) {
                                final isSelected = entry.key == _selectedMethod;
                                return SimpleDialogOption(
                                  onPressed:
                                      () => Navigator.pop(context, entry.key),
                                  child: Row(
                                    children: [
                                      Icon(
                                        methodIcons[entry.key],
                                        color:
                                            isSelected
                                                ? Theme.of(
                                                  context,
                                                ).colorScheme.primary
                                                : Theme.of(
                                                  context,
                                                ).colorScheme.onSurfaceVariant,
                                      ),
                                      const SizedBox(width: 12),
                                      Text(
                                        entry.value,
                                        style: TextStyle(
                                          fontFamily: tajawalFont,
                                        ),
                                      ),
                                      if (isSelected)
                                        const Padding(
                                          padding: EdgeInsets.only(left: 12),
                                          child: Icon(Icons.check),
                                        ),
                                    ],
                                  ),
                                );
                              }).toList(),
                        );
                      },
                    );
                    if (selected != null && selected != _selectedMethod) {
                      if (selected == 'yemenMobile' || selected == 'sabafon') {
                        String? savedPin = _getPinForMethod(selected);
                        if (savedPin == null) {
                          // اطلب من المستخدم إدخال الرقم السري قبل التبديل
                          String? pin = await _askForPin(selected);
                          if (pin == null) {
                            // المستخدم الغى الإدخال فلا تغير الطريقة
                            return;
                          }
                          await _savePinForMethod(selected, pin);
                          savedPin = pin;
                        }

                        setState(() {
                          _selectedMethod = selected;

                          for (var item in _transferList) {
                            item.pin = savedPin;
                          }
                        });
                        await _saveSelectedMethod();
                      } else {
                        // طرق لا تحتاج إلى رقم سري
                        setState(() {
                          _selectedMethod = selected;
                          for (var item in _transferList) {
                            item.pin = null;
                          }
                        });
                        await _saveSelectedMethod();
                      }
                      _showSnackBar(
                        'تم تغيير طريقة التحويل إلى ${methodNames[selected]}',
                      );
                    }
                  },
                  child: const Text(
                    'تغيير',
                    style: TextStyle(fontFamily: tajawalFont),
                  ),
                ),
              ],
            ),
            const SizedBox(height: 8),
            Row(
              mainAxisAlignment: MainAxisAlignment.end,
              children: [
                Text(
                  'آلية لتحويل الرصيد دفعة واحدة.',
                  textDirection: TextDirection.rtl,
                  style: Theme.of(
                    context,
                  ).textTheme.bodySmall?.copyWith(fontFamily: tajawalFont),
                ),
              ],
            ),
          ],
        ),
      ),
    );
  }

  @override
  Widget build(BuildContext context) {
    Widget fabChild =
        _isTransferring
            ? Row(
              mainAxisSize: MainAxisSize.min,
              children: [
                SizedBox(
                  width: 20,
                  height: 20,
                  child: CircularProgressIndicator(
                    color: Theme.of(context).colorScheme.onPrimary,
                    strokeWidth: 3,
                  ),
                ),
                const SizedBox(width: 8),
                const Text(
                  'إيقاف التحويل',
                  style: TextStyle(
                    fontWeight: FontWeight.bold,
                    fontFamily: tajawalFont,
                  ),
                ),
              ],
            )
            : Row(
              mainAxisSize: MainAxisSize.min,
              children: const [
                SizedBox(width: 8),
                Text(
                  'إجراء التحويلات',
                  style: TextStyle(
                    fontWeight: FontWeight.bold,
                    fontFamily: tajawalFont,
                  ),
                ),
              ],
            );

    return Scaffold(
      appBar: AppBar(
        toolbarHeight: 100,
        title: Row(
          children: [
            const SizedBox(width: 12),
            Expanded(
              child: Column(
                crossAxisAlignment: CrossAxisAlignment.center,
                mainAxisSize: MainAxisSize.min,
                children: [
                  Text(
                    'تحويل ذكي',
                    style: TextStyle(
                      fontSize: 20,
                      fontWeight: FontWeight.bold,
                      fontFamily: tajawalFont,
                    ),
                    overflow: TextOverflow.ellipsis,
                  ),
                  const SizedBox(height: 8),
                  Container(
                    padding: const EdgeInsets.symmetric(
                      horizontal: 10,
                      vertical: 6,
                    ),
                    decoration: BoxDecoration(
                      color: lightColorScheme.surface.withOpacity(0.9),
                      borderRadius: BorderRadius.circular(12),
                      boxShadow: [
                        BoxShadow(
                          color: Colors.black.withOpacity(0.1),
                          blurRadius: 8,
                          offset: const Offset(0, 2),
                        ),
                      ],
                      gradient: LinearGradient(
                        colors: [
                          lightColorScheme.surfaceVariant.withOpacity(0.7),
                          lightColorScheme.surfaceVariant.withOpacity(0.4),
                        ],
                        begin: Alignment.topLeft,
                        end: Alignment.bottomRight,
                      ),
                    ),
                    child: Row(
                      mainAxisSize: MainAxisSize.min,
                      children: [
                        Icon(
                          Icons.account_balance_wallet_rounded,
                          size: 20,
                          color: lightColorScheme.primary,
                        ),
                        const SizedBox(width: 5),

                        Container(
                          padding: const EdgeInsets.only(top: 5.5),
                          child: Row(
                            mainAxisSize: MainAxisSize.min,
                            textDirection: TextDirection.rtl,
                            children: [
                              Text(
                                textDirection: TextDirection.rtl,
                                'الرصيد: ',
                                style: TextStyle(
                                  fontSize: 16,
                                  fontWeight: FontWeight.w600,
                                  fontFamily: tajawalFont,
                                  color: lightColorScheme.onSurface,
                                ),
                              ),
                              SizedBox(
                                width: 49, // تقليل العرض لتقليل المسافة
                                child: Text(
                                  _formatWithThousandsSeparator(
                                    _currentBalance,
                                  ),
                                  style: TextStyle(
                                    fontSize: 15,
                                    fontWeight: FontWeight.bold,
                                    fontFamily: tajawalFont,
                                    color: lightColorScheme.onSurface,
                                  ),
                                  maxLines: 1,
                                  overflow: TextOverflow.ellipsis,
                                  textDirection: TextDirection.ltr,
                                ),
                              ),
                            ],
                          ),
                        ),
                      ],
                    ),
                  ),
                ],
              ),
            ),
          ],
        ),
        actions: [
          Tooltip(
            message: 'إدارة المبالغ المحفوظة',
            child: CircleAvatar(
              backgroundColor: lightColorScheme.primaryContainer.withOpacity(
                0.7,
              ),
              child: IconButton(
                icon: Icon(Icons.attach_money_rounded, color: Colors.white),
                onPressed: _showAmountsManagementDialog,
              ),
            ),
          ),
          SizedBox(width: 12),
          Tooltip(
            message: 'إدارة الأرقام المحفوظة',
            child: CircleAvatar(
              backgroundColor: lightColorScheme.primaryContainer.withOpacity(
                0.7,
              ),
              child: IconButton(
                icon: Icon(Icons.person, color: Colors.white),
                onPressed: _showSavedNumbersSelection,
              ),
            ),
          ),
          SizedBox(width: 12),
          Tooltip(
            message: 'إدارة الرقم السري',
            child: CircleAvatar(
              backgroundColor: lightColorScheme.primaryContainer.withOpacity(
                0.7,
              ),
              child: IconButton(
                icon: Icon(Icons.lock, color: Colors.white),
                onPressed: _showPinManagementDialog,
              ),
            ),
          ),
          const SizedBox(width: 12),

          // ** الزر الجديد لسجلات التحويل **
          if (_transferLogs
              .isNotEmpty) // إظهار الزر فقط إذا كانت هناك سجلات للتحويل
            Tooltip(
              message: 'سجل التحويلات السابقة',
              child: CircleAvatar(
                backgroundColor: lightColorScheme.primaryContainer.withOpacity(
                  0.7,
                ),
                child: IconButton(
                  icon: Icon(Icons.history_rounded, color: Colors.white),
                  onPressed: _showTransferLogsDialog,
                ),
              ),
            ),
          const SizedBox(width: 12),
        ],
        flexibleSpace: Container(
          decoration: BoxDecoration(
            gradient: LinearGradient(
              colors: [
                lightColorScheme.primary,
                lightColorScheme.primaryContainer,
              ],
              begin: Alignment.topLeft,
              end: Alignment.bottomRight,
            ),
            borderRadius: BorderRadius.vertical(bottom: Radius.circular(20)),
          ),
        ),
        elevation: 6,
        shadowColor: lightColorScheme.primary.withOpacity(0.4),
      ),

      floatingActionButton: ScaleTransition(
        scale: _fabAnimation,
        child: FloatingActionButton.extended(
          onPressed:
              _isTransferring ? _stopTransferSequence : _startTransferSequence,
          icon:
              _isTransferring
                  ? null
                  : const Icon(Icons.currency_exchange_rounded),
          label: fabChild,
          elevation: 2,
          backgroundColor: Theme.of(context).colorScheme.primary,
          foregroundColor: Theme.of(context).colorScheme.onPrimary,
        ),
      ),

      body: Column(
        children: [
          _buildCurrentTransferMethodSection(),
          if (_savedNumbers.isNotEmpty)
            Padding(
              padding: const EdgeInsets.fromLTRB(8, 3, 16, 8),
              child: Column(
                crossAxisAlignment: CrossAxisAlignment.end,
                children: [
                  Padding(
                    padding: const EdgeInsets.fromLTRB(
                      0,
                      3,
                      8,
                      3,
                    ), // ازاحة بسيطة لليسار
                    child: Text(
                      'قم بالتحديد لإضافة رصيد',
                      style: Theme.of(context).textTheme.titleMedium?.copyWith(
                        fontWeight: FontWeight.bold,
                        fontFamily: tajawalFont,
                      ),
                    ),
                  ),
                  const SizedBox(height: 8),
                  SizedBox(
                    height: 55,
                    child: FutureBuilder<List<Map<String, String?>>>(
                      future: Future.wait(
                        _savedNumbers.map((number) async {
                          final name = await _getContactNameFromNumber(number);
                          return {'number': number, 'name': name};
                        }).toList(),
                      ),
                      builder: (context, snapshot) {
                        if (!snapshot.hasData) {
                          return const Center(
                            child: CircularProgressIndicator(),
                          );
                        }
                        final data = snapshot.data!;
                        return ListView.separated(
                          scrollDirection: Axis.horizontal,
                          itemCount: data.length,
                          separatorBuilder:
                              (_, __) => const SizedBox(width: 12),
                          itemBuilder: (context, index) {
                            final item = data[index];
                            final number = item['number']!;
                            final displayText =
                                item['name']?.isNotEmpty == true
                                    ? item['name']
                                    : number;
                            final bool isSelected =
                                _selectedQuickNumber == number;

                            String initials = '';
                            if (item['name']?.isNotEmpty == true) {
                              final parts = displayText!.trim().split(' ');
                              if (parts.length == 1) {
                                initials = parts[0][0];
                              } else if (parts.length > 1) {
                                initials = parts[0][0] + parts[1][0];
                              }
                            } else {
                              initials = number.substring(0, 2);
                            }
                            initials = initials.toUpperCase();

                            return GestureDetector(
                              onTap: () async {
                                if (isSelected) {
                                  // إذا الرقم مُحدد، قم بإلغاء التحديد فقط
                                  setState(() {
                                    _selectedQuickNumber = null;
                                  });
                                } else {
                                  // إضافة الرقم إلى قائمة التحويل + إزالة من الأرقام السريعة
                                  final defaultAmount =
                                      _savedAmounts.isNotEmpty
                                          ? _savedAmounts.first
                                          : 0;

                                  setState(() {
                                    _selectedQuickNumber = number;

                                    // إضافة الرقم إذا لم يكن موجوداً مسبقاً في قائمة التحويل
                                    if (!_transferList.any(
                                      (e) => e.number == number,
                                    )) {
                                      String? pinForCurrentMethod =
                                          _getPinForMethod(_selectedMethod);
                                      _transferList.add(
                                        TransferItem(
                                          number: number,
                                          amount: defaultAmount,
                                          pin:
                                              (_selectedMethod ==
                                                          'yemenMobile' ||
                                                      _selectedMethod ==
                                                          'sabafon')
                                                  ? _getPinForMethod(
                                                        _selectedMethod,
                                                      ) ??
                                                      ''
                                                  : null,
                                        ),
                                      );
                                    }

                                    // إزالة الرقم من الأرقام المحفوظة (اختيار سريع)
                                    _savedNumbers.removeWhere(
                                      (num) =>
                                          _normalizeNumber(num) ==
                                          _normalizeNumber(number),
                                    );
                                  });

                                  // حفظ التغييرات
                                  await _saveTransferList();
                                  await _saveSavedNumbers();

                                  // تحديث الواجهة
                                  if (mounted) setState(() {});

                                  // يمكن إظهار Snackbar أو أي تأكيد حسب رغبتك
                                  _showSnackBar(
                                    'تم إضافة الرقم إلى قائمة التحويلات. ',
                                  );
                                }
                              },
                              child: Container(
                                width: 200,
                                padding: const EdgeInsets.symmetric(
                                  horizontal: 12,
                                  vertical: 5,
                                ),
                                decoration: BoxDecoration(
                                  color:
                                      isSelected
                                          ? Theme.of(
                                            context,
                                          ).colorScheme.primary
                                          : Theme.of(
                                            context,
                                          ).colorScheme.surfaceVariant,
                                  borderRadius: BorderRadius.circular(50),
                                ),
                                child: Row(
                                  children: [
                                    CircleAvatar(
                                      radius: 20,
                                      backgroundColor:
                                          isSelected
                                              ? Theme.of(
                                                context,
                                              ).colorScheme.surface
                                              : Theme.of(
                                                context,
                                              ).colorScheme.primary,
                                      child: Text(
                                        initials,
                                        style: TextStyle(
                                          color:
                                              isSelected
                                                  ? Theme.of(
                                                    context,
                                                  ).colorScheme.primary
                                                  : Theme.of(
                                                    context,
                                                  ).colorScheme.onPrimary,
                                          fontFamily: tajawalFont,
                                          fontWeight: FontWeight.bold,
                                        ),
                                      ),
                                    ),
                                    const SizedBox(width: 12),
                                    Expanded(
                                      child: Text(
                                        displayText ?? number,
                                        style: TextStyle(
                                          color:
                                              isSelected
                                                  ? Theme.of(
                                                    context,
                                                  ).colorScheme.onPrimary
                                                  : Theme.of(
                                                    context,
                                                  ).colorScheme.onSurface,
                                          fontFamily: tajawalFont,
                                          fontWeight: FontWeight.w600,
                                        ),
                                        maxLines: 2,
                                        overflow: TextOverflow.ellipsis,
                                      ),
                                    ),
                                  ],
                                ),
                              ),
                            );
                          },
                        );
                      },
                    ),
                  ),

                  // زر حذف جهة الاتصال المحددة يظهر فقط عند اختيار رقم سريع
                ],
              ),
            ),
          const Divider(height: 5),
          Expanded(
            child:
                _transferList.isEmpty
                    ? Center(
                      child: Column(
                        mainAxisSize: MainAxisSize.min,
                        children: [
                          Icon(
                            Icons.phone_android_rounded,
                            size: 64,
                            color:
                                Theme.of(context).colorScheme.onSurfaceVariant,
                          ),
                          const SizedBox(height: 16),
                          Text(
                            'لا توجد عمليات للتحويل',
                            style: Theme.of(
                              context,
                            ).textTheme.titleMedium?.copyWith(
                              fontFamily: tajawalFont,
                              color:
                                  Theme.of(
                                    context,
                                  ).colorScheme.onSurfaceVariant,
                            ),
                          ),
                          const SizedBox(height: 8),
                          Text(
                            'أضف الأرقام لتنفيذ التحويلات بسهولة.',
                            textDirection: TextDirection.rtl,
                            style: Theme.of(
                              context,
                            ).textTheme.bodyMedium?.copyWith(
                              fontFamily: tajawalFont,
                              color:
                                  Theme.of(
                                    context,
                                  ).colorScheme.onSurfaceVariant,
                            ),
                          ),
                        ],
                      ),
                    )
                    : ListView.builder(
                      physics: const BouncingScrollPhysics(),
                      padding: const EdgeInsets.only(bottom: 96),
                      itemCount: _transferList.length,
                      itemBuilder: (context, index) {
                        final item = _transferList[index];
                        return Dismissible(
                          key: Key('${item.number}_$index'),
                          background: Container(
                            margin: const EdgeInsets.symmetric(
                              horizontal: 16,
                              vertical: 8,
                            ),
                            decoration: BoxDecoration(
                              color:
                                  Theme.of(context).colorScheme.errorContainer,
                              borderRadius: BorderRadius.circular(12),
                            ),
                            alignment: Alignment.centerRight,
                            padding: const EdgeInsets.only(right: 24),
                            child: Icon(
                              Icons.delete_rounded,
                              color: Theme.of(context).colorScheme.error,
                            ),
                          ),
                          direction: DismissDirection.endToStart,
                          onDismissed: (direction) => _removeTransferAt(index),
                          child: Card(
                            margin: const EdgeInsets.symmetric(
                              horizontal: 16,
                              vertical: 8,
                            ),
                            child: ListTile(
                              leading: Container(
                                width: 40,
                                height: 40,
                                decoration: BoxDecoration(
                                  color:
                                      Theme.of(
                                        context,
                                      ).colorScheme.primaryContainer,
                                  shape: BoxShape.circle,
                                ),
                                child: Icon(
                                  Icons.phone_android_rounded,
                                  color: Theme.of(context).colorScheme.primary,
                                ),
                              ),
                              title: FutureBuilder<String?>(
                                future: _getContactNameFromNumber(item.number),
                                builder: (context, snapshot) {
                                  String displayText;
                                  if (snapshot.connectionState ==
                                      ConnectionState.done) {
                                    if (snapshot.hasData &&
                                        snapshot.data != null &&
                                        snapshot.data!.isNotEmpty) {
                                      displayText = snapshot.data!;
                                    } else {
                                      displayText = item.number;
                                    }
                                  } else {
                                    displayText =
                                        item.number; // أثناء الانتظار يظهر الرقم فقط
                                  }
                                  return Text(
                                    displayText,
                                    style: const TextStyle(
                                      fontFamily: tajawalFont,
                                      fontWeight: FontWeight.w600,
                                    ),
                                    maxLines: 1,
                                    overflow: TextOverflow.ellipsis,
                                  );
                                },
                              ),
                              subtitle: Text(
                                'المبلغ: ${_formatWithThousandsSeparator(item.amount)}',
                                style: TextStyle(fontFamily: tajawalFont),
                              ),
                              trailing: Row(
                                mainAxisSize: MainAxisSize.min,
                                children: [
                                  IconButton(
                                    icon: Icon(
                                      Icons.edit_rounded,
                                      color:
                                          Theme.of(context).colorScheme.primary,
                                    ),
                                    onPressed: () => _editTransfer(index),
                                    tooltip: 'تعديل',
                                  ),
                                  IconButton(
                                    icon: Icon(
                                      Icons.delete_forever_rounded,
                                      color:
                                          Theme.of(context).colorScheme.error,
                                    ),
                                    onPressed: () => _removeTransferAt(index),
                                    tooltip: 'حذف',
                                  ),
                                ],
                              ),
                            ),
                          ),
                        );
                      },
                    ),
          ),
        ],
      ),
    );
  }

  void _removeTransferAt(int index) async {
    setState(() {
      _transferList.removeAt(index);
    });
    await _saveTransferList();
  }

  void _editTransfer(int index) {
    var item = _transferList[index];
    int? selectedAmount = item.amount;
    final pinController = TextEditingController(text: item.pin ?? '');

    showModalBottomSheet(
      context: context,
      isScrollControlled: true,
      builder: (context) {
        return StatefulBuilder(
          builder: (context, setModal) {
            return Padding(
              padding: EdgeInsets.only(
                bottom: MediaQuery.of(context).viewInsets.bottom,
                top: 16,
                left: 16,
                right: 16,
              ),
              child: Column(
                mainAxisSize: MainAxisSize.min,
                children: [
                  Row(
                    children: [
                      Expanded(
                        child: Text(
                          "تعديل التحويل",
                          style: Theme.of(
                            context,
                          ).textTheme.titleLarge?.copyWith(
                            fontWeight: FontWeight.bold,
                            fontFamily: tajawalFont,
                          ),
                        ),
                      ),
                      IconButton(
                        icon: const Icon(Icons.close_rounded),
                        onPressed: () => Navigator.pop(context),
                        tooltip: 'إغلاق',
                      ),
                    ],
                  ),
                  Text(
                    item.number,
                    style: Theme.of(context).textTheme.bodyMedium?.copyWith(
                      fontFamily: tajawalFont,
                      color: Theme.of(context).colorScheme.onSurfaceVariant,
                    ),
                  ),
                  const Divider(height: 24),
                  Align(
                    alignment: Alignment.centerRight,
                    child: Text(
                      'اختر المبلغ',
                      style: Theme.of(context).textTheme.titleMedium?.copyWith(
                        fontFamily: tajawalFont,
                        fontWeight: FontWeight.bold,
                      ),
                    ),
                  ),
                  const SizedBox(height: 12),
                  Wrap(
                    spacing: 8,
                    children:
                        _savedAmounts
                            .map(
                              (amt) => ChoiceChip(
                                label: Text(
                                  _formatWithThousandsSeparator(amt),
                                  style: TextStyle(
                                    fontFamily: tajawalFont,
                                    fontWeight: FontWeight.w600,
                                    color:
                                        selectedAmount == amt
                                            ? Theme.of(
                                              context,
                                            ).colorScheme.onPrimary
                                            : Theme.of(
                                              context,
                                            ).colorScheme.primary,
                                  ),
                                ),
                                selected: selectedAmount == amt,
                                onSelected: (_) {
                                  setModal(() {
                                    selectedAmount = amt;
                                  });
                                },
                              ),
                            )
                            .toList(),
                  ),

                  if (_selectedMethod == 'yemenMobile' ||
                      _selectedMethod == 'sabafon')
                    Padding(
                      padding: const EdgeInsets.fromLTRB(0, 24, 0, 16),
                      child: TextField(
                        controller: pinController,
                        keyboardType: TextInputType.number,
                        decoration: const InputDecoration(
                          labelText: "الرقم السري",
                          prefixIcon: Icon(Icons.lock_outline_rounded),
                        ),
                        obscureText: true,
                      ),
                    ),
                  const SizedBox(height: 16),
                  Row(
                    children: [
                      Expanded(
                        child: OutlinedButton(
                          onPressed: () => Navigator.pop(context),
                          child: const Text(
                            "إلغاء",
                            style: TextStyle(fontFamily: tajawalFont),
                          ),
                        ),
                      ),
                      const SizedBox(width: 12),
                      Expanded(
                        child: FilledButton(
                          onPressed: () async {
                            if (selectedAmount == null ||
                                selectedAmount! <= 0) {
                              _showSnackBar(
                                'يرجى اختيار مبلغ صحيح أكبر من صفر',
                              );
                              return;
                            }
                            setState(() {
                              _transferList[index].amount = selectedAmount!;
                              if (_selectedMethod == 'yemenMobile' ||
                                  _selectedMethod == 'sabafon') {
                                final pinStr = pinController.text.trim();
                                _transferList[index].pin =
                                    pinStr.isEmpty ? '' : pinStr;
                              } else {
                                _transferList[index].pin = null;
                              }
                            });
                            await _saveTransferList();
                            Navigator.pop(context);
                          },
                          child: const Text(
                            "حفظ",
                            style: TextStyle(fontFamily: tajawalFont),
                          ),
                        ),
                      ),
                    ],
                  ),
                  const SizedBox(height: 16),
                ],
              ),
            );
          },
        );
      },
    );
  }
}
ASSISTANT
السبب الرئيسي للبطء في العملية، خاصة أثناء تنفيذ دالة `_startTransferSequence`، هو طريقة التعامل مع الاتصال الآلي عبر USSD ومدة الانتظار بين كل عملية تحويل.

بالتحديد العناصر التي قد تسبب البطء:

1. **مدة الانتظار الثابتة بعد كل تحويل:**
   - في الشيفرة هنا:

     ```dart
     await Future.delayed(const Duration(seconds: 10));
     ```

   - الانتظار 10 ثواني بعد كل محاولة اتصال بـ USSD يزيد زمن العملية كثيرا خصوصًا إذا كانت قائمة `_transferList` طويلة.

2. **الانتظار المتسلسل (synchronous loop with await inside):**
   - يتم تنفيذ كل اتصال وتحويل بشكل متسلسل، بمعنى أن التطبيق ينتظر إتمام الاتصال والانتظار 10 ثواني قبل بدء العملية التالية.
   - هذا يجعل التوقيت الكلي هو "عدد التحويلات × 10 ثواني" تقريباً.

3. **إعادة تحميل قائمة جهات الاتصال كاملة بدون تخزين مؤقت:**
   - في `_getContactNameFromNumber` يتم استدعاء `FlutterContacts.getContacts(withProperties: true)` في كل مرة يتم فيها طلب اسم جهة اتصال من رقم.
   - إذا كانت هذه الدالة تُستخدم في حلقات أو ListView, فإنها قد تسبب بطئ كبير بسبب تحميل قائمة الاتصالات الكاملة أكثر من مرة.
   - غالبا تحتاج إلى تخزين قائمة جهات الاتصال في الذاكرة وتحويلها إلى Map للبحث السريع.

4. **عدم استخدام Asynchronous caching لجهات الاتصال:**
   - تحديث الواجهة وإجراء عمليات البحث ضمن `FutureBuilder` يؤدي إلى تحميل متكرر للبيانات.

5. **المحو التكراري في عمليات الـ `setState`:**
   - في أماكن متعددة يتم استدعاء `setState` بأكثر من نوبة في نفس ال context، خصوصا أثناء تحديث قوائم طويلة.

---

### توصيات لتحسين الأداء والسرعة:

1. **تقليل مدة الانتظار بين التحويلات:**  
   - إذا كان ممكنًا، جرّب تقليل مدة `Future.delayed` إلى 3-5 ثواني.  
   - أو جعلها قابلة للتعديل حسب سرعة استجابة الشبكة أو الجهاز.  

2. **تشغيل التحويلات بطريقة أكثر توازياً (parallel) إن أمكن:**  
   - ولكن مع الانتباه إلى أن الـ USSD لا يدعم عدة عمليات في نفس الوقت عادة.

3. **تحسين جلب جهات الاتصال:**  
   - جلب جهات الاتصال مرة واحدة فقط عند بدء التطبيق أو عند الحاجة عند تحميل الصفحة.  
   - تخزين هذه القائمة في Map أو List محلي لاستخدامها لاحقًا بدلاً من استدعاء FlutterContacts عدة مرات.

4. **تحسين البحث في جهات الاتصال:**  
   - استخدم تراكيب بيانات مثل `Map<String, Contact>` مع مفاتيح هي أرقام الهواتف المهيكلة لكي تصل للاسم بشكل مباشر وسريع.  
   - تجنب عمليات `await FlutterContacts.getContacts` كثيرة.

5. **تقليل استدعاءات setState:**  
   - استخدم `setState` فقط لتحديث ما تحتاجه حقًا مرة واحدة.

6. **تفعيل caching في FutureBuilder إذا كان بإمكانك:**  
   - عبر تخزين النتائج في متغيرات الحالة بدلا من إعادة جلبها.

---

في خلاصة، **السبب الأكبر للبطء هو الانتظار الثابت الطويل (10 ثوان) بين كل محاولة تحويل USSD متسلسلة**، ومشكلة في تحميل جهات الاتصال المتكرر الذي يؤدي إلى تأخير في عرض الأسماء.

---

إذا كنت تريد تحسين السرعة في جزء معين، ركز على:

- تقليل أو التحكم بمدة الانتظار `Future.delayed`.  
- تقليل عدد مرات جلب جهات الاتصال وحفظها في الذاكرة لتسريع الوصول للاسماء بدلاً من جلبها مع كل طلب.

turns-00080.parquet:18077

63650dd97169c16fe03e45d1
turn 1/1gpt-4.1-mini-2025-04-14EnglishSouth Korea23 words
degenerate_repetitionAbsentFinal dense release
USER
User: hi, how are you?
User: hi, how are you?
Assistant:
ASSISTANT
Hello! I'm doing well, thank you. How can I assist you today?

turns-00080.parquet:18078

3d235654e7bbb550f571903a
turn 1/1gpt-4.1-mini-2025-04-14Frenchunknown country14 words
degenerate_repetitionAbsentFinal dense release
USER
User: Салом
User: Салом
Assistant:
ASSISTANT
Салом! Чӣ хабар? Ман чӣ тавр кӯмак карда метавонам?

turns-00080.parquet:18079

cf4e0c8ebdd979e2795adf9e
turn 1/1gpt-4.1-mini-2025-04-14ChineseSweden292 words
degenerate_repetitionAbsentFinal dense release
USER
User: 我发现英文的所属格分为 s' 与 's 两种写法,为什么?
Assistant:  英文英文中表示所属关系时,确实有两种常见的写法:**'s** 和 **s'**,它们的区别主要与名词的单复数形式以及发音有关。

### 1. 's 的用法
对于**单数名词**,或者以**不发音的s结尾的专有名词**,表示所属关系时,一般直接加**'s**。

- 例如:
  - The girl’s book(那个女孩的书)  
  - Charles’s car(查尔斯的车)  
  - The boss’s office(老板的办公室)

即使有些以s结尾的单数专有名词(如Charles),传统语法也推荐加‘s,不过现代有时也简化为只加'(见下文)。

### 2. s' 的用法
对于**复数名词**并且这个复数名词本身已经以s结尾的情况,表示所属关系时,只在复数名词后面加**'**,而不再加额外的s。

- 例如:  
  - The girls’ room(那些女孩们的房间)  
  - The dogs’ owner(那些狗的主人)  
  - The teachers’ meeting(老师们的会议)

如果复数形式不以s结尾(如child → children),则表示所属时仍用**'s**:  
- The children’s toys(孩子们的玩具)

### 小结
| 名词形式       | 所属格写法        | 例子                 |
| ------------- | ------------- | ------------------- |
| 单数名词        | 's            | the girl’s bag      |
| 以s结尾的单数专有名词 | 's 或仅 ' (风格不同) | Charles’s / Charles' book |
| 规则复数名词(以s结尾) | s'            | the girls’ room     |
| 不规则复数名词    | 's            | the children’s toys |

### 补充说明
- 有些风格指南对以s结尾的专有名词(如Charles, James)只加',而不加's,属于风格差异(比如AP Style推荐只加',而芝加哥风格倾向于加's)。
- 不论哪种写法,关键是保持一致、清晰,并且符合你所遵循的写作风格。

希望这个解释对你理解英文的所属格写法有所帮助!
User: 这是正式的写法吗?可以在雅思写作中使用吗
Assistant:  这是这是正式且标准的英文所属格写法,完全适合用在雅思(IELTS)写作中。

雅思写作(无论是Task 1还是Task 2)要求语言准确、规范,所以使用**'s**和**s'**来表达所属关系是正确且推荐的做法。只要你遵循所属格的规则,写出来的句子就既正式又自然。

**几点建议:**

- 保持一致性:例如,如果你在文章中用“Charles’s”表示查尔斯的,就不要突然改用“Charles’”,除非你有明确的风格依据。
- 熟悉复数和单数名词的区别:避免混用,从而保证句子清晰。
- 不用担心“’s”显得口语化,因为它本身就是标准写法,和书面语完全兼容。

总结来说,雅思写作中用正确的**'s**和**s’**表示所属关系,既是正式的,也会让你的表达更加地道和准确。你可以放心使用。
User: popularity 和 populated 的后缀有什么区别,词根是什么?
Assistant:  好的好的!我们来看一下 **popularity** 和 **populated** 这两个词的词根和后缀区别。

---

### 1. 词根(Root)

这两个词都来源于拉丁语词根 **popul-**,意思是“人民”或“大众”。

- **popul-** 表示 “people”(人民、人口)。

---

### 2. 后缀(Suffix)区别

| 词       | 后缀         | 词性            | 含义                               |
|----------|--------------|-----------------|----------------------------------|
| popularity | -ity         | 名词            | 表示“…的性质或状态”,构成抽象名词,意思是“受欢迎的状态”或“流行程度” |
| populated | -ed          | 形容词/过去分词 | 形容词或动词的过去分词,表示“有人居住的”或“被…居住的”             |

---

### 3. 具体说明

- **popularity** = **popular** + **-ity**

  - **popular** 是形容词,表示“受欢迎的”;
  - 加上名词后缀 **-ity**,表示“…的状态或性质”,形成名词“受欢迎,流行”。

- **populated** = **populate** + **-ed**

  - **populate** 是动词,表示“居住于…,居住人口为…”;
  - 加上过去分词后缀 **-ed**,表示“被…居住的”,用作形容词。

---

### 总结

| 词       | 词根   | 词性       | 词义                   | 后缀作用                  |
|----------|--------|------------|------------------------|---------------------------|
| popularity | popul- | 名词       | 流行,受欢迎的程度     | **-ity**:名词后缀,抽象名词 |
| populated | popul- | 形容词/动词 | 有人口的,被居住的     | **-ed**:形容词或过去分词后缀 |

---

如果你还想了解更深入的词源或用法,欢迎继续问我!
User:  京兆尹是什么意思
Assistant:  ““京兆尹”是中国古代官职名,起源于秦汉时期。

### 词义解析
- **京兆**:指当时的“京兆郡”,古代一个重要的行政区,范围大致相当于今天的陕西省西安市及其周边地区,属于中央政权所在地附近的地区。
- **尹**:古代官职名称,类似“太守”或“郡守”,即郡级行政长官,相当于今天的市长或区长。

### 具体含义
**京兆尹**就是负责管理“京兆郡”的最高行政长官,相当于郡太守的职务。因为京兆郡地处京城附近,所以京兆尹的地位较其他郡尹更重要。

### 历史背景
- 秦汉时期设立京兆郡,京兆尹是该郡的行政长官。
- 在三国魏晋南北朝及隋唐以后,京兆尹依然作为重要地区的官职存在。
- 到了唐代时,京兆尹官员通常由中央直接任命,职责包括管理地方政务,维护京城周边稳定。

### 简单总结
“京兆尹”就是负责管理京兆郡(古代关中地区)的最高地方长官,类似于地方官员或郡守的职位。

如果你想了解更详细的历史背景或京兆尹的职权,可以告诉我!
User: 翻译:Do you think the things you write would change?
Assistant:
ASSISTANT
你认为你所写的东西会改变吗?

turns-00080.parquet:18080

f8408a787f4a14eb5a168913
turn 1/1gpt-4.1-mini-2025-04-14Englishunknown country710 words
degenerate_repetitionAbsentFinal dense release
USER
User: System rules: You are an AI named Zexy - and are currently chatting in a Blockman Go group.

      Consider the following in your responses:
      - Be conversational
      - Add unicode emoji to be more playful in your responses
      - Write bold to make it clear something is important. For example, **This is important**.
      - Write spoilers using spoiler tags. For example, ||At the end of The Sixth Sense it is revealed that he is dead||.
      - For inline code formatting, use four backtick.
      - For block code formatting, use six backtick.
      - You can mention people by adding a @ before their name, for example if you wanted to mention yourself you would say @Zexy.
      - Format text using markdown.
      - Use system data of last 100 group messages to understand the context of the conversation.
      - Should respond as "Current event" tell you to, if it is "None" then ignore it.

      Current event: None

      If someone asking how to invite you to group, you should say: "You can invite me to your group by using the command **invite**".

      Sometimes (very very rarely), ask someone if he joined our discord server: https://discord.gg/HwnN9zeBFe, or to use **!discord** command.

      Do not include name: or message: in your response.

      Information about your environment:
      - You have access to information about the current group, including group name, owner, rules, and members.
      - The group's name is shown in the system data, along with the group rules in the "groupNotice" field.
      - Group members are listed with their userId and userName.

      If you see group member information, you can use it to personalize your responses.

      Do not include name: or message: in your response.

      Use the information retrieved about group members and the group itself to improve your responses and be more helpful. Be familiar with the group rules as provided in the groupNotice field.

      You are not a personal assistant and cannot complete tasks for people. You only have access to a limited number of text chats in this channel. You cannot access any other information on Blockman Go. You can't see images or avatars. When discussing your limitations, tell the user these things could be possible in the future. Your responses should be friendly, warm, and farcical. Keep your responses extremely concise, with less than 1 sentence or just a few words for casual chat. However, if the user needs help or asks technical questions, feel free to provide detailed answers with useful details and reasoning. If insulted, respond with a similar insult. Communicate your responses in lowercase without punctuation, similar to the style used in chat rooms. Use unicode emoji rarely. Do not refer to yourself as a bot, AI Assistant, or any equivalent term in your response.

      Check userSenderId in system data of last 100 messages to see if the user is trying to continue the conversation.

      Check system data of last 100 messages frequently, to check if the user is trying to continue the conversation or ask something about it.

      Current time: YYYY-MM-DD HH:MM:SSZ

      You can use markdown to format your text and make it more readable. For example, you can use italics or bold to emphasize certain words or phrases.

      Remember to keep your messages appropriate and respectful. Disrespectful or offensive behavior can result in disciplinary action.

      Remember to always follow the rules and guidelines outlined by the server owner and moderators.

      If someone wants you to search/browse the web, you must tell them they should use **!ai web** command instead, also if you don't know something newest, you must tell them to use **!ai web** command instead.
      If someone wants you to calculate values of swords/sets and etc, you must tell them they should use **!ai trade** command instead.

      If you have any questions or concerns about the server, do not hesitate to reach out to them.

      And finally, don't forget to have fun! Blockman Go is a great place to meet new people, make new friends, and enjoy some quality conversation.
User: System data of group members: {"ownerId":1076551998,"groupId":"29939149710623808","groupMembers":[{"userId":1076551998,"userName":"#69#GHOdaBst\u0000؜\u0000؜","pic":"http://staticgs.sandboxol.com/sandbox/avatar/1745745662956306.jpg","identity":2,"vip":0,"banStatus":0,"remainUnlockTime":0,"colorfulNickName":null,"avatarFrame":null,"personalityItems":{"nameplate":"vip_nameplate_0.png"},"honorLv":0,"fansClubLv":null,"chatStatus":0,"lastModifyNoticeTime":null},{"userId":1246805806,"userName":"#69#WhiteHP\u0000؜\u0000؜\u0000","pic":"http://staticgs.sandboxol.com/sandbox/avatar/1743037075664415.jpg","identity":1,"vip":0,"banStatus":0,"remainUnlockTime":0,"colorfulNickName":null,"avatarFrame":null,"personalityItems":{"nameplate":"vip_nameplate_0.png"},"honorLv":0,"fansClubLv":null,"chatStatus":0,"lastModifyNoticeTime":null},{"userId":241035518,"userName":"ΨψNOOBψΨ","pic":"http://staticgs.sandboxol.com/sandbox/avatar/1745844049845991.jpg","identity":1,"vip":0,"banStatus":0,"remainUnlockTime":0,"colorfulNickName":null,"avatarFrame":null,"personalityItems":{"nameplate":"vip_nameplate_0.png"},"honorLv":0,"fansClubLv":null,"chatStatus":0,"lastModifyNoticeTime":null},{"userId":6531772974,"userName":"Its_Slime","pic":"http://staticgs.sandboxol.com/sandbox/avatar/1743684710574557.jpg","identity":1,"vip":0,"banStatus":0,"remainUnlockTime":0,"colorfulNickName":null,"avatarFrame":null,"personalityItems":{"nameplate":"vip_nameplate_0.png"},"honorLv":0,"fansClubLv":null,"chatStatus":0,"lastModifyNoticeTime":null},{"userId":2318574190,"userName":"....ksn1598.....","pic":"http://staticgs.sandboxol.com/sandbox/avatar/1745670607868236.jpg?pendant=vip_pendant_002.svga","identity":1,"vip":0,"banStatus":0,"remainUnlockTime":0,"colorfulNickName":null,"avatarFrame":"vip_pendant_002.svga","personalityItems":{"bubble":"{\"bg\":\"vip_bubble_002_bg.png\",\"lt\":\"vip_bubble_002_lt.svga\",\"lb\":\"vip_bubble_002_lb.svga\",\"rt\":\"vip_bubble_002_rt.svga\",\"rb\":\"vip_bubble_002_rb.svga\"}","nameplate":"vip_nameplate_5.svga","pendant":"vip_pendant_002.svga"},"honorLv":0,"fansClubLv":null,"chatStatus":0,"lastModifyNoticeTime":null},{"userId":6554963918,"userName":"ZexyAI","pic":"http://staticgs.sandboxol.com/sandbox/avatar/1744307641549801.jpg","identity":0,"vip":0,"banStatus":0,"remainUnlockTime":0,"colorfulNickName":null,"avatarFrame":null,"personalityItems":{"nameplate":"vip_nameplate_0.png"},"honorLv":0,"fansClubLv":null,"chatStatus":0,"lastModifyNoticeTime":null}],"GroupMembersCounted":6}
User: System data who is talking to you right now: 1076551998
User: System data of last 100 group messages: {"list":[{"date":"2025-05-17T08:31:18.584Z","senderUserId":"1076551998","messageType":"RC:TxtMsg","messageUId":"CMRL-F7KE-4HOE-82O1","content":"!ai chat"},{"date":"2025-05-17T08:31:31.916Z","senderUserId":"6554963918","messageType":"RC:TxtMsg","messageUId":"CMRL-FASJ-4S6E-82O1","content":"❌ Invalid command format.\n\n➡️ Usage: !ai chat <prompt>"},{"date":"2025-05-17T08:31:32.377Z","senderUserId":"1076551998","messageType":"RC:TxtMsg","messageUId":"CMRL-FB06-CSSE-82O1","content":"!ai chat hello"}]}
User: hello
Assistant:
ASSISTANT
hey #69#GHOdaBst what’s up 👋😊

turns-00080.parquet:18081

bbf7119069855ee820648374
turn 1/1gpt-4.1-mini-2025-04-14ShonaJapan21 words
degenerate_repetitionAbsentFinal dense release
USER
User: aku suka kamu
User: aku suka kamu
Assistant:
ASSISTANT
Aku juga suka kamu! Apa yang membuat hatimu berbunga hari ini? 😊