import 'package:flutter/material.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:url_launcher/url_launcher.dart'; import '../../data/models/whatsapp_status_model.dart'; import '../../data/models/meta_session_model.dart'; import '../cubit/dashboard_cubit.dart'; class ChannelsView extends StatefulWidget { final WhatsAppStatusModel? whatsappStatus; final List metaSessions; final VoidCallback onRefresh; const ChannelsView({ super.key, required this.whatsappStatus, required this.metaSessions, required this.onRefresh, }); @override State createState() => _ChannelsViewState(); } class _ChannelsViewState extends State with SingleTickerProviderStateMixin { late TabController _tabController; @override void initState() { _tabController = TabController(length: 3, vsync: this); super.initState(); } @override void dispose() { _tabController.dispose(); super.dispose(); } // English: Open confirmation dialog to disconnect WhatsApp. void _showWhatsAppDisconnectDialog(BuildContext context) { showDialog( context: context, builder: (dialogContext) { return AlertDialog( backgroundColor: const Color(0xFF15102A), title: const Text('قطع اتصال الواتساب', style: TextStyle(color: Colors.white)), content: const Text( 'هل أنت متأكد من رغبتك في قطع اتصال الواتساب؟ سيؤدي ذلك إلى تعطيل الردود التلقائية لعملاء الواتساب.', style: TextStyle(color: Colors.white70), ), actions: [ TextButton( onPressed: () => Navigator.pop(dialogContext), child: const Text('إلغاء', style: TextStyle(color: Colors.white60)), ), TextButton( onPressed: () { Navigator.pop(dialogContext); context.read().disconnectWhatsApp(); }, child: const Text('نعم، اقطع الاتصال', style: TextStyle(color: Colors.redAccent)), ), ], ); }, ); } // English: Open confirmation dialog to disconnect a Meta session. void _showMetaDisconnectDialog(BuildContext context, MetaSessionModel session) { showDialog( context: context, builder: (dialogContext) { return AlertDialog( backgroundColor: const Color(0xFF15102A), title: Text( session.channelType == 'messenger' ? 'قطع اتصال ماسنجر' : 'قطع اتصال إنستغرام', style: const TextStyle(color: Colors.white), ), content: Text( 'هل أنت متأكد من رغبتك في قطع الاتصال عن ${session.pageName}؟', style: const TextStyle(color: Colors.white70), ), actions: [ TextButton( onPressed: () => Navigator.pop(dialogContext), child: const Text('إلغاء', style: TextStyle(color: Colors.white60)), ), TextButton( onPressed: () { Navigator.pop(dialogContext); context.read().disconnectMetaSession(session.id); }, child: const Text('نعم، اقطع الاتصال', style: TextStyle(color: Colors.redAccent)), ), ], ); }, ); } // English: Show connect dialog for Facebook Page or Instagram Business Account. void _showConnectMetaDialog(BuildContext context, String type) { final pageNameController = TextEditingController(); final pageIdController = TextEditingController(); final tokenController = TextEditingController(); final formKey = GlobalKey(); showDialog( context: context, builder: (dialogContext) { return AlertDialog( backgroundColor: const Color(0xFF15102A), title: Text( type == 'messenger' ? 'ربط صفحة فيسبوك' : 'ربط حساب إنستغرام', style: const TextStyle(color: Colors.white, fontSize: 18, fontWeight: FontWeight.bold), ), content: Form( key: formKey, child: SingleChildScrollView( child: Column( mainAxisSize: MainAxisSize.min, children: [ Container( width: double.infinity, padding: const EdgeInsets.all(12), margin: const EdgeInsets.only(bottom: 16), decoration: BoxDecoration( color: Colors.white.withOpacity(0.03), borderRadius: BorderRadius.circular(8), border: Border.all(color: Colors.white10), ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( children: [ const Icon(Icons.info_outline, color: Colors.purpleAccent, size: 16), const SizedBox(width: 6), Text( type == 'messenger' ? 'تعليمات ربط صفحة فيسبوك:' : 'تعليمات ربط حساب إنستغرام:', style: const TextStyle( color: Colors.purpleAccent, fontSize: 13, fontWeight: FontWeight.bold, ), ), ], ), const SizedBox(height: 8), if (type == 'messenger') ...[ _buildStep('1. اذهب إلى developers.facebook.com وأنشئ تطبيقاً.'), _buildStep('2. أضف منتج Messenger إلى لوحة تحكم تطبيقك.'), _buildStep('3. اربط صفحتك وولد رمز الوصول (Page Access Token).'), _buildStep('4. انسخ معرّف الصفحة والرمز وضعهما أدناه.'), ] else ...[ _buildStep('1. حول حساب إنستغرام لحساب أعمال واربطه بصفحة فيسبوك.'), _buildStep('2. اذهب لـ developers.facebook.com وأضف Messenger.'), _buildStep('3. انسخ معرّف حساب الأعمال من إعدادات الصفحة المرتبطة.'), _buildStep('4. ولد رمز وصول الصفحة المرتبطة وضعه في الحقل أدناه.'), ], ], ), ), TextFormField( controller: pageNameController, style: const TextStyle(color: Colors.white), decoration: InputDecoration( labelText: type == 'messenger' ? 'اسم الصفحة' : 'اسم الحساب', labelStyle: const TextStyle(color: Colors.white60), enabledBorder: const UnderlineInputBorder(borderSide: BorderSide(color: Colors.white30)), ), validator: (v) => (v == null || v.isEmpty) ? 'الرجاء إدخال الاسم' : null, ), const SizedBox(height: 12), TextFormField( controller: pageIdController, style: const TextStyle(color: Colors.white), decoration: InputDecoration( labelText: type == 'messenger' ? 'معرّف الصفحة (Page ID)' : 'معرّف الحساب (Account ID)', labelStyle: const TextStyle(color: Colors.white60), enabledBorder: const UnderlineInputBorder(borderSide: BorderSide(color: Colors.white30)), ), validator: (v) => (v == null || v.isEmpty) ? 'الرجاء إدخال المعرّف' : null, ), const SizedBox(height: 12), TextFormField( controller: tokenController, style: const TextStyle(color: Colors.white), decoration: const InputDecoration( labelText: 'رمز الوصول للصفحة (Access Token)', labelStyle: TextStyle(color: Colors.white60), enabledBorder: UnderlineInputBorder(borderSide: BorderSide(color: Colors.white30)), ), validator: (v) => (v == null || v.isEmpty) ? 'الرجاء إدخال رمز الوصول' : null, ), ], ), ), ), actions: [ TextButton( onPressed: () => Navigator.pop(dialogContext), child: const Text('إلغاء', style: TextStyle(color: Colors.white60)), ), ElevatedButton( style: ElevatedButton.styleFrom(backgroundColor: Colors.purpleAccent), onPressed: () { if (formKey.currentState!.validate()) { Navigator.pop(dialogContext); context.read().connectMetaSession( type, pageIdController.text.trim(), pageNameController.text.trim(), tokenController.text.trim(), ); } }, child: const Text('ربط وتفعيل'), ), ], ); }, ); } @override Widget build(BuildContext context) { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ // English: Channel selector TabBar. Container( color: const Color(0xFF15102A), child: TabBar( controller: _tabController, indicatorColor: Colors.purpleAccent, labelColor: Colors.purpleAccent, unselectedLabelColor: Colors.white60, tabs: const [ Tab(icon: Icon(Icons.phone_android), text: 'واتساب'), Tab(icon: Icon(Icons.facebook), text: 'فيسبوك ماسنجر'), Tab(icon: Icon(Icons.camera_alt), text: 'إنستغرام'), ], ), ), SizedBox( height: MediaQuery.of(context).size.height * 0.75, child: TabBarView( controller: _tabController, children: [ _buildWhatsAppTab(), _buildMetaTab('messenger'), _buildMetaTab('instagram'), ], ), ), ], ); } Widget _buildWhatsAppTab() { final session = widget.whatsappStatus; return SingleChildScrollView( padding: const EdgeInsets.all(20.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ const Text( '📱 إعدادات اتصال الواتساب', style: TextStyle(color: Colors.white, fontSize: 18, fontWeight: FontWeight.bold), ), const SizedBox(height: 6), const Text( 'اربط حسابك مع بوابة واتساب لتفعيل الردود التلقائية وروبوت خدمة العملاء.', style: TextStyle(color: Colors.white60, fontSize: 12), ), const SizedBox(height: 20), Container( padding: const EdgeInsets.all(20), decoration: BoxDecoration( color: const Color(0xFF15102A), borderRadius: BorderRadius.circular(16), border: Border.all(color: Colors.white.withOpacity(0.05)), ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ const Text('حالة الجلسة الحالية', style: TextStyle(color: Colors.white70, fontSize: 14)), _buildWhatsAppStatusBadge(session?.status ?? 'disconnected'), ], ), const Divider(color: Colors.white10, height: 24), _buildDetailsRow('اسم الجلسة', session?.name ?? 'WhatsApp Team'), _buildDetailsRow('مفتاح التعريف', session?.sessionKey ?? 'لا يوجد'), if (session?.phone != null) _buildDetailsRow('رقم الهاتف المرتبط', session!.phone!), const SizedBox(height: 20), if (session == null || session.status == 'disconnected') ...[ const Text( '⚠️ الحساب غير متصل. يرجى توليد رمز الاستجابة السريعة ومسحه ضوئياً لتفعيل الخدمة.', style: TextStyle(color: Colors.orangeAccent, fontSize: 12), ), const SizedBox(height: 20), ElevatedButton.icon( style: ElevatedButton.styleFrom( backgroundColor: Colors.purpleAccent, padding: const EdgeInsets.symmetric(vertical: 12, horizontal: 24), shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), ), icon: const Icon(Icons.qr_code_scanner), label: const Text('توليد رمز الاستجابة QR'), onPressed: () { context.read().requestWhatsAppQr(); }, ), ] else if (session.status == 'waiting_qr') ...[ const Text( '🔍 رمز الاستجابة جاهز. افتح الواتساب واختر الأجهزة المرتبطة لمسح الرمز:', style: TextStyle(color: Colors.yellowAccent, fontSize: 12), ), const SizedBox(height: 20), Center( child: Container( padding: const EdgeInsets.all(12), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(12), ), child: const Icon(Icons.qr_code_2, size: 180, color: Colors.black), ), ), const SizedBox(height: 20), ] else if (session.status == 'connected') ...[ const Text( '✅ الحساب متصل وجاهز للعمل. الردود التلقائية وروبوت خدمة العملاء نشطان.', style: TextStyle(color: Colors.greenAccent, fontSize: 12), ), const SizedBox(height: 20), OutlinedButton.icon( style: OutlinedButton.styleFrom( foregroundColor: Colors.redAccent, side: const BorderSide(color: Colors.redAccent), padding: const EdgeInsets.symmetric(vertical: 12, horizontal: 24), shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), ), icon: const Icon(Icons.link_off), label: const Text('قطع الاتصال'), onPressed: () => _showWhatsAppDisconnectDialog(context), ), ], ], ), ), ], ), ); } Widget _buildMetaTab(String type) { final filtered = widget.metaSessions.where((s) => s.channelType == type).toList(); final title = (type == 'messenger') ? 'فيسبوك ماسنجر' : 'إنستغرام الأعمال'; final desc = (type == 'messenger') ? 'اربط صفحات فيسبوك الخاصة بك لتفعيل الرد الآلي والمحادثات مع العملاء.' : 'اربط حسابات إنستغرام للأعمال لتفعيل روبوت المحادثة المخصص.'; return SingleChildScrollView( padding: const EdgeInsets.all(20.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( '💬 إعدادات $title', style: const TextStyle(color: Colors.white, fontSize: 18, fontWeight: FontWeight.bold), ), const SizedBox(height: 6), Text( desc, style: const TextStyle(color: Colors.white60, fontSize: 12), ), ], ), ], ), const SizedBox(height: 20), if (filtered.isEmpty) ...[ Container( width: double.infinity, padding: const EdgeInsets.all(24), decoration: BoxDecoration( color: const Color(0xFF15102A), borderRadius: BorderRadius.circular(16), ), child: Column( children: [ Icon(type == 'messenger' ? Icons.facebook : Icons.camera_alt, size: 48, color: Colors.white30), const SizedBox(height: 12), const Text('لا توجد قنوات مرتبطة حالياً', style: TextStyle(color: Colors.white70, fontSize: 14)), const SizedBox(height: 16), ElevatedButton.icon( style: ElevatedButton.styleFrom( backgroundColor: Colors.purpleAccent, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), ), icon: const Icon(Icons.add), label: Text('ربط قناة $title new'), onPressed: () => _showConnectMetaDialog(context, type), ), ], ), ), ] else ...[ ListView.builder( shrinkWrap: true, physics: const NeverScrollableScrollPhysics(), itemCount: filtered.length, itemBuilder: (context, index) { final item = filtered[index]; return Card( color: const Color(0xFF15102A), shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)), margin: const EdgeInsets.only(bottom: 12), child: ListTile( leading: CircleAvatar( backgroundColor: Colors.purpleAccent.withOpacity(0.1), child: Icon(type == 'messenger' ? Icons.messenger_outline : Icons.camera_alt, color: Colors.purpleAccent), ), title: Text(item.pageName, style: const TextStyle(color: Colors.white, fontWeight: FontWeight.bold)), subtitle: Text('ID: ${item.pageId}', style: const TextStyle(color: Colors.white60, fontSize: 12)), trailing: IconButton( icon: const Icon(Icons.delete_outline, color: Colors.redAccent), onPressed: () => _showMetaDisconnectDialog(context, item), ), ), ); }, ), const SizedBox(height: 16), Center( child: OutlinedButton.icon( style: OutlinedButton.styleFrom( foregroundColor: Colors.purpleAccent, side: const BorderSide(color: Colors.purpleAccent), ), icon: const Icon(Icons.add), label: const Text('ربط صفحة إضافية'), onPressed: () => _showConnectMetaDialog(context, type), ), ), ], ], ), ); } Widget _buildDetailsRow(String label, String value) { return Padding( padding: const EdgeInsets.symmetric(vertical: 6.0), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text(label, style: const TextStyle(color: Colors.white70, fontSize: 13)), Text(value, style: const TextStyle(color: Colors.white, fontSize: 13, fontWeight: FontWeight.bold)), ], ), ); } Widget _buildWhatsAppStatusBadge(String status) { Color color; String text; switch (status) { case 'connected': color = Colors.green; text = 'متصل'; break; case 'waiting_qr': color = Colors.orange; text = 'بانتظار المسح'; break; case 'connecting': color = Colors.blue; text = 'جاري الاتصال'; break; default: color = Colors.red; text = 'غير متصل'; break; } return Container( padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 4), decoration: BoxDecoration( color: color.withOpacity(0.2), borderRadius: BorderRadius.circular(12), border: Border.all(color: color), ), child: Text(text, style: TextStyle(color: color, fontSize: 11, fontWeight: FontWeight.bold)), ); } Widget _buildStep(String text) { const String linkText = 'developers.facebook.com'; if (text.contains(linkText)) { final List parts = text.split(linkText); return Padding( padding: const EdgeInsets.symmetric(vertical: 2.0), child: RichText( text: TextSpan( style: const TextStyle(color: Colors.white70, fontSize: 11, height: 1.4, fontFamily: 'Outfit'), // or default font family children: [ TextSpan(text: parts[0]), TextSpan( text: linkText, style: const TextStyle( color: Colors.purpleAccent, decoration: TextDecoration.underline, fontWeight: FontWeight.bold, ), recognizer: TapGestureRecognizer() ..onTap = () async { final Uri url = Uri.parse('https://developers.facebook.com'); if (await canLaunchUrl(url)) { await launchUrl(url, mode: LaunchMode.externalApplication); } }, ), if (parts.length > 1) TextSpan(text: parts[1]), ], ), ), ); } return Padding( padding: const EdgeInsets.symmetric(vertical: 2.0), child: Text( text, style: const TextStyle(color: Colors.white70, fontSize: 11, height: 1.4), ), ); } }