import 'package:dio/dio.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:superport/data/datasources/remote/api_client.dart';
import 'package:superport/data/models/vendor_dto.dart';
import 'package:superport/data/repositories/vendor_repository.dart';

void main() {
  late Dio dio;
  late VendorRepository vendorRepository;
  String? authToken;

  setUpAll(() async {
    // 직접 Dio 인스턴스 생성 (테스트용)
    dio = Dio(BaseOptions(
      baseUrl: 'http://43.201.34.104:8080/api/v1',
      connectTimeout: const Duration(seconds: 30),
      receiveTimeout: const Duration(seconds: 30),
    ));

    // 로그인하여 토큰 획득
    try {
      final loginResponse = await dio.post('/auth/login', data: {
        'email': 'admin@example.com',
        'password': 'password123',
      });
      
      authToken = loginResponse.data['access_token'];
      dio.options.headers['Authorization'] = 'Bearer $authToken';
      
      print('✅ 로그인 성공! 토큰 획득됨');
    } catch (e) {
      print('❌ 로그인 실패: $e');
      fail('로그인에 실패했습니다');
    }
  });

  group('Vendor API Tests', () {
    test('Vendors 목록 조회 테스트', () async {
      try {
        // 직접 API 호출 테스트
        final response = await dio.get('/vendors', queryParameters: {
          'page': 1,
          'limit': 5,
        });

        print('\n========== 원본 API 응답 ==========');
        print('Status Code: ${response.statusCode}');
        print('응답 데이터: ${response.data}');
        
        expect(response.statusCode, 200);
        expect(response.data, isA<Map<String, dynamic>>());
        expect(response.data['data'], isA<List>());
        expect(response.data['total'], isA<int>());
        expect(response.data['page'], isA<int>());
        expect(response.data['total_pages'], isA<int>());

        print('\n========== JSON 파싱 테스트 ==========');
        
        // VendorListResponse로 파싱 테스트
        try {
          final vendorListResponse = VendorListResponse.fromJson(response.data);
          print('✅ VendorListResponse 파싱 성공');
          print('Items 개수: ${vendorListResponse.items.length}');
          print('총 개수: ${vendorListResponse.totalCount}');
          print('현재 페이지: ${vendorListResponse.currentPage}');
          print('총 페이지: ${vendorListResponse.totalPages}');
          
          expect(vendorListResponse.items.length, greaterThan(0));
          expect(vendorListResponse.totalCount, greaterThan(0));
          
          // 첫 번째 Vendor 데이터 확인
          final firstVendor = vendorListResponse.items.first;
          print('\n첫 번째 벤더 정보:');
          print('ID: ${firstVendor.id}');
          print('이름: ${firstVendor.name}');
          print('삭제됨: ${firstVendor.isDeleted}');
          print('활성화: ${firstVendor.isActive}');
          
          expect(firstVendor.id, isNotNull);
          expect(firstVendor.name.isNotEmpty, true);
          
        } catch (e, stackTrace) {
          print('❌ VendorListResponse 파싱 실패: $e');
          print('Stack trace: $stackTrace');
          fail('JSON 파싱에 실패했습니다: $e');
        }

      } catch (e, stackTrace) {
        print('❌ API 호출 실패: $e');
        print('Stack trace: $stackTrace');
        fail('API 호출에 실패했습니다: $e');
      }
    });

    test('단일 Vendor 조회 테스트', () async {
      try {
        // 먼저 목록에서 첫 번째 벤더 ID 가져오기
        final listResponse = await dio.get('/vendors', queryParameters: {'limit': 1});
        final firstVendorId = listResponse.data['data'][0]['id'];
        
        // 단일 벤더 조회
        final response = await dio.get('/vendors/$firstVendorId');
        
        print('\n========== 단일 벤더 조회 ==========');
        print('Status Code: ${response.statusCode}');
        print('응답 데이터: ${response.data}');
        
        expect(response.statusCode, 200);
        expect(response.data, isA<Map<String, dynamic>>());
        
        // VendorDto로 파싱 테스트
        final vendor = VendorDto.fromJson(response.data);
        print('✅ VendorDto 파싱 성공');
        print('벤더 정보: ${vendor.name}');
        
      } catch (e) {
        print('❌ 단일 벤더 조회 실패: $e');
        fail('단일 벤더 조회에 실패했습니다: $e');
      }
    });
  });
}