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) {
    // 페이지네이션 응답은 변형하지 않음 (이미 올바른 구조)
    // data, total, page 등이 있으면 페이지네이션 응답으로 간주
    if (data.containsKey('data') && 
        data.containsKey('total') && 
        data.containsKey('page')) {
      return false; // 페이지네이션 응답은 변형 안함
    }
    
    // Hierarchy API 응답은 변형하지 않음 (data 배열 + meta 객체)
    if (data.containsKey('data') && data.containsKey('meta')) {
      debugPrint('[ResponseInterceptor] Hierarchy 체크 - data 타입: ${data['data'].runtimeType}, meta 타입: ${data['meta'].runtimeType}');
      if (data['data'] is List && data['meta'] is Map) {
        debugPrint('[ResponseInterceptor] Hierarchy 응답 감지 - 변형 안함');
        return false; // Hierarchy 응답은 변형 안함
      }
    }
    
    // 엔티티 단일 응답 패턴 (vendor, model, equipment 등)
    // id, name이 있으면서 registered_at 또는 created_at이 있으면 엔티티 응답으로 간주
    if (data.containsKey('id') && 
        data.containsKey('name') && 
        (data.containsKey('registered_at') || data.containsKey('created_at'))) {
      return false; // 엔티티 응답은 변형 안함
    }
    
    // equipment-history 응답 패턴
    // transaction_type이 있으면 equipment-history 응답으로 간주
    if (data.containsKey('transaction_type') && 
        data.containsKey('id') && 
        data.containsKey('created_at')) {
      debugPrint('[ResponseInterceptor] Equipment-history 응답 감지 - 변형 안함');
      return false; // equipment-history 응답은 변형 안함
    }
    
    // 로그인 응답 패턴
    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')) {
      return true;
    }
    
    // 그 외 일반적인 데이터 응답
    // success, error, message 등의 메타 키가 없으면 데이터 응답으로 간주
    final metaKeys = ['success', 'error', 'status', 'code'];
    final hasMetaKey = metaKeys.any((key) => data.containsKey(key));
    
    return !hasMetaKey;
  }
}