اريد اضافة شاشة splash تظهر قبل هذة لثواني محددة واريد ان تضيف فيها مكان لعرض logo الشركة
import 'dart:convert';

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:shared_preferences/shared_preferences.dart';

// إضافة الخطوط هنا
const tajawalFont = 'Tajawal';

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 SplashScreen extends StatefulWidget {
  const SplashScreen({super.key});

  @override
  State<SplashScreen> createState() => _SplashScreenState();
}

class _SplashScreenState extends State<SplashScreen>
    with TickerProviderStateMixin {
  bool _isLoading = true;
  bool _hasSavedBalance = false;

  int _currentBalance = 0;
  int _additionalBalance = 0;
  int _totalBalance = 0;

  late TextEditingController _balanceController;
  late TextEditingController _additionalBalanceController;

  bool _showAdditionalBalanceField = false;

  late AnimationController _animationController;
  late Animation<double> _logoScaleAnimation;
  late Animation<Offset> _contentSlideAnimation;
  late Animation<double> _fadeAnimation;

  @override
  void initState() {
    super.initState();
    _balanceController = TextEditingController();
    _additionalBalanceController = TextEditingController();

    _balanceController.addListener(_checkBalanceForAdditionalField);

    _animationController = AnimationController(
      vsync: this,
      duration: const Duration(milliseconds: 1000),
    );

    _logoScaleAnimation = Tween<double>(begin: 0.8, end: 1).animate(
      CurvedAnimation(parent: _animationController, curve: Curves.easeOutBack),
    );

    _contentSlideAnimation = Tween<Offset>(
      begin: const Offset(0, 30),
      end: Offset.zero,
    ).animate(
      CurvedAnimation(parent: _animationController, curve: Curves.easeOutQuart),
    );

    _fadeAnimation = Tween<double>(begin: 0, end: 1).animate(
      CurvedAnimation(parent: _animationController, curve: Curves.easeInOut),
    );

    _animationController.forward();
    _loadBalance();
  }

  @override
  void dispose() {
    _balanceController.removeListener(_checkBalanceForAdditionalField);
    _balanceController.dispose();
    _additionalBalanceController.dispose();
    _animationController.dispose();
    super.dispose();
  }

  Future<void> _loadBalance() async {
    final prefs = await SharedPreferences.getInstance();
    final savedData = prefs.getString('balance_data');

    if (savedData != null) {
      final Map<String, dynamic> jsonData = jsonDecode(savedData);

      setState(() {
        _currentBalance = jsonData['current_balance'] ?? 0;
        _additionalBalance = jsonData['additional_balance'] ?? 0;
        _totalBalance = jsonData['total_balance'] ?? 0;
        _hasSavedBalance = true;

        _balanceController.text = _formatWithThousandsSeparator(
          _currentBalance,
        );

        // اجعل الحقل الإضافي ظاهر دائمًا إذا كان هناك بيانات محفوظة سواء كانت صفر أو أكثر
        _showAdditionalBalanceField = true;

        _additionalBalanceController.text = '';
      });
    } else {
      // لا بيانات محفوظة: إخفاء الحقل الإضافي
      setState(() {
        _showAdditionalBalanceField = false;
      });
    }

    setState(() {
      _isLoading = false;
    });
  }

  void _checkBalanceForAdditionalField() {
    final text = _balanceController.text.replaceAll(',', '').trim();
    final balance = int.tryParse(text) ?? 0;
    final additionalText =
        _additionalBalanceController.text.replaceAll(',', '').trim();
    final shouldShow = balance > 0 || additionalText.isNotEmpty;

    if (shouldShow != _showAdditionalBalanceField) {
      setState(() {
        _showAdditionalBalanceField = shouldShow;
        if (!_showAdditionalBalanceField) {
          _additionalBalanceController.clear();
        }
      });
    }
  }

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

  Future<void> _saveBalances({
    required int currentBalance,
    required int additionalBalance,
    required int totalBalance,
  }) async {
    final prefs = await SharedPreferences.getInstance();

    Map<String, dynamic> balanceData = {
      'current_balance': currentBalance,
      'additional_balance': additionalBalance,
      'total_balance': totalBalance,
    };

    await prefs.setString('balance_data', jsonEncode(balanceData));
  }

  void _onContinue() async {
    final currentInput = _balanceController.text.replaceAll(',', '').trim();
    final additionalInput =
        _additionalBalanceController.text.replaceAll(',', '').trim();

    final currentBalanceInput = int.tryParse(currentInput);
    final additionalBalanceInput = int.tryParse(
      additionalInput.isEmpty ? '0' : additionalInput,
    );

    if (currentBalanceInput == null || currentBalanceInput < 0) {
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(
          content: const Text(
            'يرجى إدخال مبلغ رصيد صالح (صفر أو أكثر) في الرصيد الحالي',
            style: TextStyle(fontFamily: tajawalFont),
          ),
          behavior: SnackBarBehavior.floating,
          shape: RoundedRectangleBorder(
            borderRadius: BorderRadius.circular(10),
          ),
          backgroundColor: Theme.of(context).colorScheme.error,
        ),
      );
      return;
    }

    if (additionalInput.isNotEmpty &&
        (additionalBalanceInput == null || additionalBalanceInput < 0)) {
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(
          content: const Text(
            'يرجى إدخال مبلغ رصيد إضافي صالح (صفر أو أكثر) أو تركه فارغًا',
            style: TextStyle(fontFamily: tajawalFont),
          ),
          behavior: SnackBarBehavior.floating,
          shape: RoundedRectangleBorder(
            borderRadius: BorderRadius.circular(10),
          ),
          backgroundColor: Theme.of(context).colorScheme.error,
        ),
      );
      return;
    }

    int totalBalance = currentBalanceInput + (additionalBalanceInput ?? 0);

    // تعديل هنا: تحديث القيم الداخلية للحالة State
    setState(() {
      _currentBalance = totalBalance; // استبدال الرصيد الحالي بالإجمالي
      if (additionalBalanceInput != null && additionalBalanceInput > 0) {
        _additionalBalance = additionalBalanceInput;
      }
      _totalBalance = totalBalance;

      // مسح الحقول
      _balanceController.clear();
      _additionalBalanceController.clear();

      // إخفاء الحقل الإضافي لأنه الآن مفروض أن يكون صفر
      _showAdditionalBalanceField = false;

      // نعلم أن لدينا رصيد محفوظ لأننا سنقوم بحفظ البيانات
      _hasSavedBalance = true;
    });

    // حفظ التغييرات
    await _saveBalances(
      currentBalance: _currentBalance,
      additionalBalance: _additionalBalance,
      totalBalance: _totalBalance,
    );

    // بعد التنفيذ، انتقل للصفحة الرئيسية
    Navigator.pushReplacementNamed(context, '/home');
  }

  Widget _smallBalanceInfo(String label, int value) {
    final theme = Theme.of(context);
    final colors = theme.colorScheme;

    return Column(
      mainAxisSize: MainAxisSize.min,
      children: [
        Text(
          label,
          style: theme.textTheme.bodySmall?.copyWith(
            fontFamily: tajawalFont,
            color: Colors.grey[600],
          ),
        ),
        const SizedBox(height: 2),
        Text(
          _formatWithThousandsSeparator(value),
          style: theme.textTheme.bodyMedium?.copyWith(
            fontFamily: tajawalFont,
            fontWeight: FontWeight.bold,
            color: colors.primary,
          ),
        ),
      ],
    );
  }

  @override
  Widget build(BuildContext context) {
    final theme = Theme.of(context);
    final colors = theme.colorScheme;

    return Scaffold(
      backgroundColor: Colors.white,
      body: SafeArea(
        child: Padding(
          padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 16),
          child:
              _isLoading
                  ? Center(
                    child: CircularProgressIndicator(
                      color: colors.primary,
                      strokeWidth: 2,
                    ),
                  )
                  : Column(
                    children: [
                      Expanded(
                        child: SingleChildScrollView(
                          physics: const BouncingScrollPhysics(),
                          child: Column(
                            crossAxisAlignment: CrossAxisAlignment.center,
                            children: [
                              const SizedBox(height: 40),
                              ScaleTransition(
                                scale: _logoScaleAnimation,
                                child: Container(
                                  width: 120,
                                  height: 120,
                                  decoration: BoxDecoration(
                                    color: colors.primary.withOpacity(0.1),
                                    shape: BoxShape.circle,
                                  ),
                                  child: Icon(
                                    Icons.currency_exchange_rounded,
                                    size: 60,
                                    color: colors.primary,
                                  ),
                                ),
                              ),
                              const SizedBox(height: 40),
                              SlideTransition(
                                position: _contentSlideAnimation,
                                child: FadeTransition(
                                  opacity: _fadeAnimation,
                                  child: Column(
                                    children: [
                                      Text(
                                        'مرحبًا بك في تطبيق حوّلها',
                                        style: theme.textTheme.headlineSmall
                                            ?.copyWith(
                                              color: Colors.black,
                                              fontWeight: FontWeight.bold,
                                              height: 1.4,
                                              fontFamily: tajawalFont,
                                            ),
                                        textAlign: TextAlign.center,
                                      ),
                                      const SizedBox(height: 16),
                                      Text(
                                        'أدخل رصيدك الحالي أو أضف رصيدًا إضافيًا لبدء إدارة وتحويل رصيدك بسهولة',
                                        style: theme.textTheme.bodyLarge
                                            ?.copyWith(
                                              color: Colors.grey[700],
                                              height: 1.6,
                                              fontFamily: tajawalFont,
                                              fontSize: 14,
                                            ),
                                        textAlign: TextAlign.center,
                                      ),
                                    ],
                                  ),
                                ),
                              ),
                              const SizedBox(height: 40),
                              SlideTransition(
                                position: _contentSlideAnimation,
                                child: FadeTransition(
                                  opacity: _fadeAnimation,
                                  child: TextField(
                                    controller: _balanceController,
                                    keyboardType: TextInputType.number,
                                    inputFormatters: [
                                      ThousandsSeparatorInputFormatter(),
                                    ],
                                    textAlign: TextAlign.right,
                                    style: theme.textTheme.titleMedium
                                        ?.copyWith(
                                          fontWeight: FontWeight.w600,
                                          fontFamily: tajawalFont,
                                        ),
                                    decoration: InputDecoration(
                                      filled: true,
                                      fillColor: Colors.grey[50],
                                      hintText: 'مثال: 1,000',
                                      hintStyle: TextStyle(
                                        fontFamily: tajawalFont,
                                      ),
                                      labelText: 'الرصيد الحالي',
                                      labelStyle: TextStyle(
                                        fontFamily: tajawalFont,
                                      ),
                                      prefixIcon: Icon(
                                        Icons.account_balance_wallet,
                                        color: colors.primary,
                                      ),
                                      border: OutlineInputBorder(
                                        borderRadius: BorderRadius.circular(12),
                                        borderSide: BorderSide(
                                          color: Colors.grey[300]!,
                                        ),
                                      ),
                                      enabledBorder: OutlineInputBorder(
                                        borderRadius: BorderRadius.circular(12),
                                        borderSide: BorderSide(
                                          color: Colors.grey[300]!,
                                        ),
                                      ),
                                      focusedBorder: OutlineInputBorder(
                                        borderRadius: BorderRadius.circular(12),
                                        borderSide: BorderSide(
                                          color: colors.primary,
                                          width: 2,
                                        ),
                                      ),
                                      floatingLabelBehavior:
                                          FloatingLabelBehavior.always,
                                      contentPadding:
                                          const EdgeInsets.symmetric(
                                            horizontal: 20,
                                            vertical: 16,
                                          ),
                                    ),
                                  ),
                                ),
                              ),
                              const SizedBox(height: 24),
                              if (_showAdditionalBalanceField)
                                SlideTransition(
                                  position: _contentSlideAnimation,
                                  child: FadeTransition(
                                    opacity: _fadeAnimation,
                                    child: TextField(
                                      controller: _additionalBalanceController,
                                      keyboardType: TextInputType.number,
                                      inputFormatters: [
                                        ThousandsSeparatorInputFormatter(),
                                      ],
                                      textAlign: TextAlign.right,
                                      style: theme.textTheme.titleMedium
                                          ?.copyWith(
                                            fontWeight: FontWeight.w600,
                                            fontFamily: tajawalFont,
                                          ),
                                      decoration: InputDecoration(
                                        filled: true,
                                        fillColor: Colors.grey[50],
                                        hintText: 'مثال: 500 (اختياري)',
                                        hintStyle: TextStyle(
                                          fontFamily: tajawalFont,
                                        ),
                                        labelText: 'رصيد إضافي (اختياري)',
                                        labelStyle: TextStyle(
                                          fontFamily: tajawalFont,
                                        ),
                                        prefixIcon: Icon(
                                          Icons.add_circle_outline,
                                          color: colors.primary,
                                        ),
                                        border: OutlineInputBorder(
                                          borderRadius: BorderRadius.circular(
                                            12,
                                          ),
                                          borderSide: BorderSide(
                                            color: Colors.grey[300]!,
                                          ),
                                        ),
                                        enabledBorder: OutlineInputBorder(
                                          borderRadius: BorderRadius.circular(
                                            12,
                                          ),
                                          borderSide: BorderSide(
                                            color: Colors.grey[300]!,
                                          ),
                                        ),
                                        focusedBorder: OutlineInputBorder(
                                          borderRadius: BorderRadius.circular(
                                            12,
                                          ),
                                          borderSide: BorderSide(
                                            color: colors.primary,
                                            width: 2,
                                          ),
                                        ),
                                        floatingLabelBehavior:
                                            FloatingLabelBehavior.always,
                                        contentPadding:
                                            const EdgeInsets.symmetric(
                                              horizontal: 20,
                                              vertical: 16,
                                            ),
                                      ),
                                    ),
                                  ),
                                ),

                              // هنا نضيف عرض مصغر للرصدات تحت الحقول، بدون التأثير على التصميم
                              if (_hasSavedBalance)
                                Padding(
                                  padding: const EdgeInsets.only(top: 24),
                                  child: Row(
                                    mainAxisAlignment:
                                        MainAxisAlignment.spaceEvenly,
                                    children: [
                                      _smallBalanceInfo(
                                        'الرصيد السابق',
                                        _totalBalance - _additionalBalance,
                                      ),
                                      if (_showAdditionalBalanceField)
                                        _smallBalanceInfo(
                                          'الرصيد الإضافي',
                                          _additionalBalance,
                                        ),
                                      _smallBalanceInfo(
                                        'الإجمالي',
                                        _totalBalance,
                                      ),
                                    ],
                                  ),
                                ),
                            ],
                          ),
                        ),
                      ),
                      const SizedBox(height: 24),
                      SlideTransition(
                        position: _contentSlideAnimation,
                        child: FadeTransition(
                          opacity: _fadeAnimation,
                          child: SizedBox(
                            width: double.infinity,
                            child: ElevatedButton(
                              onPressed: _onContinue,
                              style: ElevatedButton.styleFrom(
                                backgroundColor: colors.primary,
                                foregroundColor: Colors.white,
                                padding: const EdgeInsets.symmetric(
                                  vertical: 16,
                                ),
                                shape: RoundedRectangleBorder(
                                  borderRadius: BorderRadius.circular(12),
                                ),
                                elevation: 0,
                                shadowColor: Colors.transparent,
                              ),
                              child: Text(
                                'ابدأ الآن',
                                style: theme.textTheme.titleMedium?.copyWith(
                                  fontWeight: FontWeight.bold,
                                  color: Colors.white,
                                  fontFamily: tajawalFont,
                                ),
                              ),
                            ),
                          ),
                        ),
                      ),
                    ],
                  ),
        ),
      ),
    );
  }
}