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

/// 공통 위젯 테스트 유틸
/// - MaterialApp/Scaffold 래핑
/// - Provider 래핑 헬퍼
/// - 드롭다운 오버레이 비의존 패턴(onChanged 직접 호출) 헬퍼
class WidgetTestUtils {
  const WidgetTestUtils._();

  /// MaterialApp + Scaffold로 감싸서 펌프
  static Future<void> pumpWithScaffold(
    WidgetTester tester,
    Widget child,
  ) async {
    await tester.pumpWidget(
      MaterialApp(
        home: Scaffold(body: child),
      ),
    );
    // 첫 프레임 렌더링
    await tester.pump();
  }

  /// MultiProvider로 감싸서 펌프
  static Future<void> pumpWithProviders(
    WidgetTester tester, {
    required List<SingleChildWidget> providers,
    required Widget child,
  }) async {
    await tester.pumpWidget(
      MultiProvider(
        providers: providers,
        child: MaterialApp(home: Scaffold(body: child)),
      ),
    );
    await tester.pump();
  }

  /// DropdownButtonFormField의 onChanged를 직접 호출하여 값 변경
  /// overlay를 열지 않아도 되어 타임아웃/플레이키를 방지한다.
  static Future<void> selectDropdownValue<T>(
    WidgetTester tester, {
    Key? fieldKey,
    T? value,
    Type fieldType = DropdownButtonFormField,
  }) async {
    final finder = fieldKey != null
        ? find.byKey(fieldKey)
        : find.byType(fieldType);
    final field = tester.widget<DropdownButtonFormField<T>>(finder);
    field.onChanged?.call(value);
    await tester.pump();
  }
}
