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 _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 _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'),
          ),
        ),
        const _RequestHistoryButton(),
        Card(
          child: ListTile(
            leading: const Icon(Icons.history),
            title: const Text('Riwayat Chat'),
            trailing: const Icon(Icons.chevron_right),
            onTap: () => context.push('/chat/history'),
          ),
        ),
      ],
    );
  }
}

class _RequestHistoryButton extends ConsumerWidget {
  const _RequestHistoryButton();

  @override
  Widget build(BuildContext context, WidgetRef ref) {
    // Watch state to rebuild when requests arrive/clear; count comes from
    // the notifier which tracks both displayed + queued requests.
    ref.watch(chatRequestProvider);
    final count = ref.read(chatRequestProvider.notifier).activeRequestCount;

    final hasPending = count > 0;
    final trailing = hasPending
        ? Row(
            mainAxisSize: MainAxisSize.min,
            children: [
              Container(
                padding:
                    const EdgeInsets.symmetric(horizontal: 8, vertical: 2),
                decoration: BoxDecoration(
                  color: Colors.red,
                  borderRadius: BorderRadius.circular(999),
                ),
                child: Text(
                  '$count',
                  style: const TextStyle(
                    color: Colors.white,
                    fontWeight: FontWeight.bold,
                    fontSize: 12,
                  ),
                ),
              ),
              const SizedBox(width: 4),
              const Icon(Icons.chevron_right),
            ],
          )
        : const Icon(Icons.chevron_right);

    return Card(
      child: ListTile(
        leading: const Icon(Icons.notifications_outlined),
        title: const Text('Riwayat Permintaan'),
        subtitle: Text(
          hasPending
              ? '$count permintaan baru'
              : 'Lihat permintaan chat sebelumnya',
        ),
        trailing: trailing,
        onTap: () => context.push('/chat/requests/history'),
      ),
    );
  }
}
