import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:frontend/home/notification_card.dart';
import 'package:frontend/model/notification.dart' as oott_model;
import 'package:frontend/model/notification_type.dart';
import 'package:frontend/utils/friendly_date_formatter.dart';

oott_model.Notification _sampleNotification({
  String? macAddress = 'AA:BB:CC:DD:EE:FF',
}) => oott_model.Notification(
  id: 1,
  title: 'New device found',
  body: 'A long body that wraps across multiple lines when expanded.',
  notificationType: NotificationType.newDeviceFound,
  createdOn: DateTime(2026, 6, 4, 12),
  isNew: true,
  macAddress: macAddress,
);

Future<void> _pumpCard(
  WidgetTester tester, {
  String? macAddress = 'AA:BB:CC:DD:EE:FF',
}) async {
  await tester.pumpWidget(
    MaterialApp(
      home: Scaffold(
        body: NotificationCard(
          item: _sampleNotification(macAddress: macAddress),
          formatter: FriendlyDateFormatter(),
          onSetRead: (_) async => true,
        ),
      ),
    ),
  );
}

void main() {
  testWidgets('tapping the body expands and then collapses the card', (
    tester,
  ) async {
    await _pumpCard(tester);

    // Initially collapsed: no action buttons.
    expect(find.text('Mark as read'), findsNothing);

    // Tap the body to expand.
    await tester.tap(find.byType(ListTile));
    await tester.pumpAndSettle();
    expect(find.text('Mark as read'), findsOneWidget);

    // Tap directly on the body text to collapse.
    await tester.tap(
      find.text('A long body that wraps across multiple lines when expanded.'),
    );
    await tester.pumpAndSettle();
    expect(find.text('Mark as read'), findsNothing);
  });

  testWidgets('tapping the action area (not a button) collapses the card', (
    tester,
  ) async {
    await _pumpCard(tester);

    await tester.tap(find.byType(ListTile));
    await tester.pumpAndSettle();
    expect(find.text('Mark as read'), findsOneWidget);

    // Tap the action row outside any button: its left edge is empty space
    // because the buttons are aligned to the end.
    final actions = tester.getRect(find.byType(OverflowBar));
    await tester.tapAt(Offset(actions.left + 1, actions.center.dy));
    await tester.pumpAndSettle();
    expect(find.text('Mark as read'), findsNothing);
  });

  testWidgets('shows a device link when the notification has a MAC address', (
    tester,
  ) async {
    await _pumpCard(tester);

    await tester.tap(find.byType(ListTile));
    await tester.pumpAndSettle();

    expect(find.text('View device'), findsOneWidget);
  });

  testWidgets(
    'omits the device link for a multi-device notification (no MAC address)',
    (tester) async {
      await _pumpCard(tester, macAddress: null);

      await tester.tap(find.byType(ListTile));
      await tester.pumpAndSettle();

      expect(find.text('View device'), findsNothing);
    },
  );
}
