import 'package:dio/dio.dart';
import '../app_navigator.dart';

class ExceptionInterceptor extends Interceptor {
  @override
  void onError(DioException err, ErrorInterceptorHandler handler) {
    _handleError(err);
    handler.next(err);
  }

  void _handleError(DioException error) {
    String message;
    switch (error.type) {
      case DioExceptionType.connectionTimeout:
      case DioExceptionType.receiveTimeout:
      case DioExceptionType.sendTimeout:
        message = 'Kết nối mạng không ổn định.\nVui lòng thử lại!';
        break;
      case DioExceptionType.connectionError:
        message = 'Không thể kết nối đến máy chủ.\nVui lòng kiểm tra kết nối mạng!';
        break;
      case DioExceptionType.badResponse:
        final statusCode = error.response?.statusCode;
        if (statusCode == 401) {
          // Auth error - handled by AuthInterceptor
          return;
        }
        message = _extractErrorMessage(error.response?.data) ??
            'Đã xảy ra lỗi. Vui lòng thử lại!';
        break;
      default:
        message = 'Đã xảy ra lỗi không xác định. Vui lòng thử lại!';
    }
    // Show alert dialog with the error message
    AppNavigator.showAlert(message);
  }

  String? _extractErrorMessage(dynamic data) {
    if (data is Map<String, dynamic>) {
      return data['message']?.toString() ??
          data['error_message']?.toString() ??
          data['errorMessage']?.toString();
    }
    return null;
  }
}

//
// typedef RetryPrompt = Future<bool> Function(DioException e);
//
// class ExceptionInterceptor extends Interceptor {
//   ExceptionInterceptor({
//     required Dio dio,
//     RetryPrompt? prompt,
//     this.shouldRetryWhen = _defaultShouldRetry,
//   })  : _dio = dio,
//         _prompt = prompt ?? _defaultPrompt;
//
//   final Dio _dio;
//   final RetryPrompt _prompt;
//
//   /// Quyết định lỗi nào là lỗi mạng đáng retry.
//   final bool Function(DioException e) shouldRetryWhen;
//
//   static bool _defaultShouldRetry(DioException e) {
//     return e.type == DioExceptionType.connectionTimeout ||
//         e.type == DioExceptionType.sendTimeout ||
//         e.type == DioExceptionType.receiveTimeout ||
//         e.type == DioExceptionType.unknown ||
//         e.type == DioExceptionType.connectionError;
//   }
//
//   static Future<bool> _defaultPrompt(DioException e) async {
//     // Dialog đơn giản với GetX. Bạn có thể thay Alert tuỳ UI của app.
//     final result = await Get.dialog<bool>(
//       AlertDialog(
//         title: const Text('Mất kết nối'),
//         content: const Text('Kết nối mạng không ổn định. Bạn có muốn thử lại không?'),
//         actions: [
//           TextButton(onPressed: () => Get.back(result: false), child: const Text('Đóng')),
//           ElevatedButton(onPressed: () => Get.back(result: true), child: const Text('Thử lại')),
//         ],
//       ),
//       barrierDismissible: false,
//     );
//     return result == true;
//   }
//
//   @override
//   void onError(DioException err, ErrorInterceptorHandler handler) async {
//     if (!shouldRetryWhen(err)) {
//       return handler.next(err);
//     }
//     if (err.requestOptions.extra['__retried__'] == true) {
//       return handler.next(err);
//     }
//     final wantRetry = await _prompt(err);
//     if (!wantRetry) {
//       return handler.next(err);
//     }
//     try {
//       final resp = await _retryRequest(err.requestOptions);
//       return handler.resolve(resp);
//     } catch (_) {
//       return handler.next(err);
//     }
//   }
//
//   Future<Response<dynamic>> _retryRequest(RequestOptions ro) {
//     // Đánh dấu đã retry để tránh vòng lặp
//     ro.extra['__retried__'] = true;
//     final options = Options(
//       method: ro.method,
//       headers: ro.headers,
//       responseType: ro.responseType,
//       contentType: ro.contentType,
//       followRedirects: ro.followRedirects,
//       receiveDataWhenStatusError: ro.receiveDataWhenStatusError,
//       validateStatus: ro.validateStatus,
//       sendTimeout: ro.sendTimeout,
//       receiveTimeout: ro.receiveTimeout,
//       extra: ro.extra,
//     );
//
//     return _dio.request<dynamic>(
//       ro.path,
//       data: ro.data, // Lưu ý: nếu dùng FormData với stream tự chế, có thể không retry được
//       queryParameters: ro.queryParameters,
//       options: options,
//       cancelToken: ro.cancelToken,
//       onSendProgress: ro.onSendProgress,
//       onReceiveProgress: ro.onReceiveProgress,
//     );
//   }
// }

