// ignore_for_file: unnecessary_library_name

@Skip('Requires live Naver API responses')
library naver_integration_test;

import 'package:flutter_test/flutter_test.dart';
import 'package:lunchpick/data/api/naver_api_client.dart';
import 'package:lunchpick/data/datasources/remote/naver_map_parser.dart';
import 'package:lunchpick/data/datasources/remote/naver_html_extractor.dart';

void main() {
  late NaverApiClient apiClient;
  late NaverMapParser parser;

  setUp(() {
    apiClient = NaverApiClient();
    parser = NaverMapParser(apiClient: apiClient);
  });

  tearDown(() {
    apiClient.dispose();
    parser.dispose();
  });

  group('네이버 통합 테스트', () {
    test('단축 URL 자동 처리 테스트', () async {
      // 실제 단축 URL로 테스트
      const shortUrl = 'https://naver.me/example'; // 실제 URL로 교체 필요

      try {
        print('========== 단축 URL 자동 처리 테스트 ==========');
        print('입력 URL: $shortUrl');

        // NaverMapParser를 통한 자동 처리
        final restaurant = await parser.parseRestaurantFromUrl(shortUrl);

        print('\n【파싱 결과】');
        print('상호명: ${restaurant.name}');
        print('카테고리: ${restaurant.category} > ${restaurant.subCategory}');
        print('주소: ${restaurant.roadAddress}');
        print('전화: ${restaurant.phoneNumber ?? "없음"}');
        print('설명: ${restaurant.description ?? "없음"}');
        print('좌표: ${restaurant.latitude}, ${restaurant.longitude}');
        print('Place ID: ${restaurant.naverPlaceId}');
        print('URL: ${restaurant.naverUrl}');

        // 검증
        expect(restaurant.name, isNotEmpty);
        expect(restaurant.category, isNotEmpty);
        expect(restaurant.roadAddress, isNotEmpty);
        expect(restaurant.naverPlaceId, isNotEmpty);
        expect(restaurant.source.name, equals('NAVER'));

        print('\n✓ 테스트 성공');
      } catch (e) {
        print('\n❌ 테스트 실패: $e');
        rethrow;
      }
    });

    test('HTML 추출기 테스트', () async {
      const testHtml = '''
      <html>
        <head>
          <script type="application/ld+json">
          {
            "@type": "Restaurant",
            "name": "테스트 식당"
          }
          </script>
        </head>
        <body>
          <h1>테스트 식당</h1>
          <p>서울특별시 강남구 테헤란로 123</p>
          <span>한식</span>
        </body>
      </html>
      ''';

      print('\n========== HTML 추출기 테스트 ==========');

      // 한글 텍스트 추출
      final koreanTexts = NaverHtmlExtractor.extractAllValidKoreanTexts(
        testHtml,
      );
      print('추출된 한글 텍스트: $koreanTexts');
      expect(koreanTexts, isNotEmpty);

      // JSON-LD 추출
      final jsonLdName = NaverHtmlExtractor.extractPlaceNameFromJsonLd(
        testHtml,
      );
      print('JSON-LD 상호명: $jsonLdName');
      expect(jsonLdName, equals('테스트 식당'));

      print('\n✓ 테스트 성공');
    });

    test('로컬 검색 API 테스트', () async {
      print('\n========== 로컬 검색 API 테스트 ==========');

      const query = '스타벅스 강남역점';

      try {
        final results = await apiClient.searchLocal(query: query, display: 5);

        print('검색어: "$query"');
        print('결과 수: ${results.length}개\n');

        for (int i = 0; i < results.length; i++) {
          final result = results[i];
          print('${i + 1}. ${result.title}');
          print('   카테고리: ${result.category}');
          print('   주소: ${result.roadAddress}');
          print('   좌표: ${result.mapx}, ${result.mapy}');
        }

        expect(results, isNotEmpty);
        print('\n✓ 테스트 성공');
      } catch (e) {
        print('\n❌ 테스트 실패: $e');
        rethrow;
      }
    });

    test('성능 테스트 - 단축 URL 처리 시간', () async {
      const shortUrl = 'https://naver.me/example'; // 실제 URL로 교체 필요

      print('\n========== 성능 테스트 ==========');

      final stopwatch = Stopwatch()..start();

      try {
        final restaurant = await parser.parseRestaurantFromUrl(shortUrl);
        stopwatch.stop();

        print('처리 완료: ${restaurant.name}');
        print('소요 시간: ${stopwatch.elapsedMilliseconds}ms');

        // 5초 이내 처리 확인
        expect(stopwatch.elapsedMilliseconds, lessThan(5000));

        print('\n✓ 테스트 성공');
      } catch (e) {
        stopwatch.stop();
        print('처리 실패 (${stopwatch.elapsedMilliseconds}ms)');
        print('오류: $e');
        rethrow;
      }
    });
  });
}
