import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:go_router/go_router.dart';
import '../../core/auth/auth_notifier.dart';
import '../../core/status/status_notifier.dart';
import '../../core/chat/chat_request_notifier.dart';
import '../../core/chat/unread_notifier.dart';

class HomeScreen extends ConsumerWidget {
  const HomeScreen({super.key});

  @override
  Widget build(BuildContext context, WidgetRef ref) {
    final authState = ref.watch(mitraAuthProvider);
    final authData = authState.valueOrNull;
    final displayName = authData is MitraAuthAuthenticatedData
        ? authData.profile['display_name'] as String
        : '';

    // Load pending requests if mitra is already online
    final statusState = ref.watch(onlineStatusProvider);
    if (statusState is StatusLoadedData && statusState.isOnline) {
      final requestState = ref.watch(chatRequestProvider);
      if (requestState is ChatRequestIdleData) {
        Future.microtask(() {
          ref.read(chatRequestProvider.notifier).startListening();
          ref.read(chatRequestProvider.notifier).loadPendingRequests();
        });
      }
    }

    // Listen for status changes to start/stop chat request listening
    ref.listen(onlineStatusProvider, (prev, next) {
      if (next is StatusLoadedData && next.isOnline) {
        ref.read(chatRequestProvider.notifier).startListening();
        ref.read(chatRequestProvider.notifier).loadPendingRequests();
      } else if (next is StatusLoadedData && !next.isOnline) {
        ref.read(chatRequestProvider.notifier).stopListening();
      }
    });

    return Scaffold(
      appBar: AppBar(
        title: const Text('Halo Bestie Mitra'),
        actions: [
          IconButton(
            icon: const Icon(Icons.logout),
            onPressed: () => ref.read(mitraAuthProvider.notifier).logout(),
          ),
        ],
      ),
      body: Padding(
        padding: const EdgeInsets.all(24),
        child: Column(
          children: [
            Text('Halo, $displayName!', style: const TextStyle(fontSize: 24)),
            const SizedBox(height: 32),
            const _StatusToggle(),
            const SizedBox(height: 16),
            const _PendingRequestsBanner(),
            const _ActiveSessionsButton(),
          ],
        ),
      ),
    );
  }
}

class _StatusToggle extends ConsumerWidget {
  const _StatusToggle();

  @override
  Widget build(BuildContext context, WidgetRef ref) {
    final statusState = ref.watch(onlineStatusProvider);
    final isOnline = statusState is StatusLoadedData && statusState.isOnline;
    final isLoading = statusState is StatusLoadingData;

    return Card(
      child: Padding(
        padding: const EdgeInsets.all(16),
        child: Row(
          mainAxisAlignment: MainAxisAlignment.spaceBetween,
          children: [
            Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: [
                Text(
                  isOnline ? 'Online' : 'Offline',
                  style: TextStyle(
                    fontSize: 18,
                    fontWeight: FontWeight.bold,
                    color: isOnline ? Colors.green : Colors.grey,
                  ),
                ),
                Text(
                  isOnline
                      ? 'Kamu siap menerima chat'
                      : 'Aktifkan untuk menerima chat',
                  style: const TextStyle(fontSize: 14, color: Colors.grey),
                ),
              ],
            ),
            isLoading
                ? const SizedBox(
                    width: 24,
                    height: 24,
                    child: CircularProgressIndicator(strokeWidth: 2),
                  )
                : Switch(
                    value: isOnline,
                    activeColor: Colors.green,
                    onChanged: (_) {
                      final notifier = ref.read(onlineStatusProvider.notifier);
                      if (isOnline) {
                        notifier.toggleOffline();
                      } else {
                        notifier.toggleOnline();
                      }
                    },
                  ),
          ],
        ),
      ),
    );
  }
}

class _PendingRequestsBanner extends ConsumerWidget {
  const _PendingRequestsBanner();

  @override
  Widget build(BuildContext context, WidgetRef ref) {
    final requestState = ref.watch(chatRequestProvider);
    final count = ref.read(chatRequestProvider.notifier).activeRequestCount;

    if (count == 0) return const SizedBox.shrink();

    final isShowingOverlay = requestState is ChatRequestIncomingData ||
        requestState is ChatRequestStaleData;

    return Padding(
      padding: const EdgeInsets.only(bottom: 16),
      child: Card(
        color: Colors.blue.shade50,
        child: ListTile(
          leading: Badge(
            label: Text('$count'),
            child: const Icon(Icons.notifications_active, color: Colors.blue),
          ),
          title: Text(
            '$count permintaan chat menunggu',
            style: const TextStyle(fontWeight: FontWeight.bold),
          ),
          subtitle: isShowingOverlay
              ? null
              : const Text('Ketuk untuk melihat'),
          onTap: isShowingOverlay
              ? null
              : () {
                  // Re-advance queue to show the next request overlay
                  final notifier = ref.read(chatRequestProvider.notifier);
                  if (requestState is ChatRequestListeningData) {
                    // Requests are queued but none is displayed — trigger next
                    notifier.ignore();
                  }
                },
        ),
      ),
    );
  }
}

class _ActiveSessionsButton extends ConsumerWidget {
  const _ActiveSessionsButton();

  @override
  Widget build(BuildContext context, WidgetRef ref) {
    final unreadCounts = ref.watch(unreadSessionsProvider);
    final totalUnread = unreadCounts.values.fold(0, (a, b) => a + b);

    return Column(
      children: [
        Card(
          child: ListTile(
            leading: Badge(
              isLabelVisible: totalUnread > 0,
              label: Text('$totalUnread'),
              child: const Icon(Icons.chat_bubble_outline),
            ),
            title: const Text('Sesi Aktif'),
            trailing: const Icon(Icons.chevron_right),
            onTap: () => context.push('/sessions'),
          ),
        ),
        Card(
          child: ListTile(
            leading: const Icon(Icons.history),
            title: const Text('Riwayat Chat'),
            trailing: const Icon(Icons.chevron_right),
            onTap: () => context.push('/chat/history'),
          ),
        ),
      ],
    );
  }
}
