import 'package:dio/dio.dart';
import 'package:flutter/foundation.dart';

/// API 응답을 정규화하는 인터셉터
/// 
/// 서버 응답 형식에 관계없이 일관된 형태로 데이터를 처리할 수 있도록 함
class ResponseInterceptor extends Interceptor {
  @override
  void onResponse(Response response, ResponseInterceptorHandler handler) {
    debugPrint('[ResponseInterceptor] 응답 수신: ${response.requestOptions.path}');
    debugPrint('[ResponseInterceptor] 상태 코드: ${response.statusCode}');
    debugPrint('[ResponseInterceptor] 응답 데이터 타입: ${response.data.runtimeType}');
    
    // 장비 관련 API 응답 상세 로깅
    if (response.requestOptions.path.contains('equipment')) {
      debugPrint('[ResponseInterceptor] 장비 API 응답 전체: ${response.data}');
      if (response.data is List && (response.data as List).isNotEmpty) {
        final firstItem = (response.data as List).first;
        debugPrint('[ResponseInterceptor] 첫 번째 장비 상태: ${firstItem['status']}');
      }
    }
    
    // 200 OK 응답만 처리
    if (response.statusCode == 200 || response.statusCode == 201) {
      // 응답 데이터가 Map인 경우만 처리
      if (response.data is Map<String, dynamic>) {
        final data = response.data as Map<String, dynamic>;
        
        // 이미 정규화된 형식인지 확인
        if (data.containsKey('success') && data.containsKey('data')) {
          debugPrint('[ResponseInterceptor] 이미 정규화된 응답 형식');
          handler.next(response);
          return;
        }
        
        // API 응답이 직접 데이터를 반환하는 경우
        // (예: {accessToken: "...", refreshToken: "...", user: {...}})
        if (_isDirectDataResponse(data)) {
          debugPrint('[ResponseInterceptor] 직접 데이터 응답을 정규화된 형식으로 변환');
          
          // 정규화된 응답으로 변환
          response.data = {
            'success': true,
            'data': data,
          };
        }
      }
    }
    
    handler.next(response);
  }
  
  /// 직접 데이터 응답인지 확인
  bool _isDirectDataResponse(Map<String, dynamic> data) {
    // 로그인 응답 패턴
    if (data.containsKey('accessToken') || 
        data.containsKey('access_token') ||
        data.containsKey('token')) {
      return true;
    }
    
    // 사용자 정보 응답 패턴
    if (data.containsKey('user') || 
        data.containsKey('id') && data.containsKey('email')) {
      return true;
    }
    
    // 리스트 응답 패턴
    if (data.containsKey('items') || 
        data.containsKey('results') ||
        data.containsKey('data') && data['data'] is List) {
      return true;
    }
    
    // 그 외 일반적인 데이터 응답
    // success, error, message 등의 메타 키가 없으면 데이터 응답으로 간주
    final metaKeys = ['success', 'error', 'status', 'code'];
    final hasMetaKey = metaKeys.any((key) => data.containsKey(key));
    
    return !hasMetaKey;
  }
}