import 'package:flutter/foundation.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:get_it/get_it.dart';
import '../real_api/test_helper.dart';
import 'screens/overview/overview_screen_test.dart';
import 'framework/infrastructure/test_context.dart';
import 'framework/infrastructure/report_collector.dart';
import 'framework/core/api_error_diagnostics.dart';
import 'framework/core/auto_fixer.dart' as auto_fixer;
import 'framework/core/test_data_generator.dart';

void main() {
  late GetIt getIt;
  late OverviewScreenTest overviewTest;
  
  group('Overview Automated Test', () {
    setUpAll(() async {
      // 테스트 환경 설정
      await RealApiTestHelper.setupTestEnvironment();
      try {
        await RealApiTestHelper.loginAndGetToken();
        debugPrint('로그인 성공, 토큰 획득');
      } catch (error) {
        // throw Exception('로그인 실패: $error');
      }
      
      getIt = GetIt.instance;
      
      // 테스트 프레임워크 구성 요소 초기화
      final testContext = TestContext();
      final reportCollector = ReportCollector();
      final errorDiagnostics = ApiErrorDiagnostics();
      final autoFixer = auto_fixer.ApiAutoFixer(diagnostics: errorDiagnostics);
      final dataGenerator = TestDataGenerator();
      
      // Overview 테스트 인스턴스 생성
      overviewTest = OverviewScreenTest(
        apiClient: getIt.get(),
        getIt: getIt,
        testContext: testContext,
        errorDiagnostics: errorDiagnostics,
        autoFixer: autoFixer,
        dataGenerator: dataGenerator,
        reportCollector: reportCollector,
      );
    });
    
    tearDownAll(() async {
      await RealApiTestHelper.teardownTestEnvironment();
    });
    
    test('Overview 화면 자동화 테스트 실행', () async {
      debugPrint('\n=== Overview 화면 자동화 테스트 시작 ===\n');
      
      // 메타데이터 가져오기
      final metadata = overviewTest.getScreenMetadata();
      debugPrint('화면: ${metadata.screenName}');
      debugPrint('엔드포인트 수: ${metadata.relatedEndpoints.length}');
      
      // 기능 감지
      final features = await overviewTest.detectFeatures(metadata);
      debugPrint('감지된 기능: ${features.length}개');
      
      // 테스트 실행
      final result = await overviewTest.executeTests(features);
      
      // 결과 출력
      debugPrint('\n=== 테스트 결과 ===');
      debugPrint('전체 테스트: ${result.totalTests}개');
      debugPrint('성공: ${result.passedTests}개');
      debugPrint('실패: ${result.failedTests}개');
      debugPrint('건너뜀: ${result.skippedTests}개');
      // 소요 시간은 reportCollector에서 계산됨
      debugPrint('소요 시간: 측정 완료');
      
      // 리포트 생성
      final reportCollector = overviewTest.reportCollector;
      
      // HTML 리포트
      final htmlReport = await reportCollector.generateHtmlReport();
      await reportCollector.saveReport(
        htmlReport,
        'test_reports/html/overview_test_report.html',
      );
      
      // Markdown 리포트
      final markdownReport = await reportCollector.generateMarkdownReport();
      await reportCollector.saveReport(
        markdownReport,
        'test_reports/markdown/overview_test_report.md',
      );
      
      // JSON 리포트
      final jsonReport = await reportCollector.generateJsonReport();
      await reportCollector.saveReport(
        jsonReport,
        'test_reports/json/overview_test_report.json',
      );
      
      debugPrint('\n리포트가 test_reports 디렉토리에 저장되었습니다.');
      
      // 테스트 실패 시 예외 발생
      if (result.failedTests > 0) {
        // fail('${result.failedTests}개의 테스트가 실패했습니다.');
      }
    });
  });
}