import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';

import 'package:lanebow/widgets/owner_dropdown.dart';
import 'package:lanebow/models/member_model.dart';

void main() {
  group('OwnerDropdown', () {
    testWidgets('빌드 시 onItemsBuilt로 항목 수를 보고하고, onChanged로 값이 변경된다', (tester) async {
      // Arrange: 샘플 멤버 2명
      final members = <Member>[
        Member(
          id: 'm1',
          userId: 'u1',
          clubId: 'c1',
          name: '아무개 A',
          email: 'a@example.com',
          gender: 'male',
          isActive: true,
          memberType: 'regular',
          status: 'active',
        ),
        Member(
          id: 'm2',
          userId: 'u2',
          clubId: 'c1',
          name: '아무개 B',
          email: 'b@example.com',
          gender: 'female',
          isActive: true,
          memberType: 'associate',
          status: 'active',
        ),
      ];

      String? selected = members.first.userId;
      int? builtCount;

      await tester.pumpWidget(
        MaterialApp(
          home: Scaffold(
            body: Padding(
              padding: const EdgeInsets.all(8.0),
              child: OwnerDropdown(
                members: members,
                value: selected,
                onChanged: (v) {
                  selected = v;
                },
                onItemsBuilt: (count) => builtCount = count,
              ),
            ),
          ),
        ),
      );

      // onItemsBuilt는 microtask로 호출되므로 한 번 더 펌프
      await tester.pump();

      // Assert: 항목 수 콜백이 2로 보고됨
      expect(builtCount, 2);

      // Act: 오버레이를 열지 않고 DropdownButtonFormField의 onChanged를 직접 호출
      final field = tester.widget<DropdownButtonFormField<String>>(
        find.byType(DropdownButtonFormField<String>),
      );
      field.onChanged?.call(members[1].userId);

      // 한 프레임 펌프하여 상태 반영
      await tester.pump();

      // Assert: 선택 값이 두 번째 사용자로 변경됨
      expect(selected, members[1].userId);
    });
  });
}
