import 'dart:async';
import '../../core.dart';

typedef RefreshTokenCallback = Future<String?> Function();
class AppInterceptor extends Interceptor {
  final RefreshTokenCallback refreshTokenCallback;

  AppInterceptor({required this.refreshTokenCallback});

  @override
  Future<void> onError(DioException err, ErrorInterceptorHandler handler) async {
    if (err.response?.statusCode == 401 && !ApiHandler.isRefreshing) {
      // اول بقیه درخواست‌ها رو کنسل کن
      ApiHandler.cancelAllRequests("Token expired - refreshing");

      ApiHandler.isRefreshing = true;

      try {
        final newToken = await refreshTokenCallback();
        if (newToken == null) throw Exception("Refresh failed");

        // تولید CancelToken جدید برای درخواست‌های بعدی
        ApiHandler.reset();

        final opts = err.requestOptions;
        opts.headers['Authorization'] = 'Bearer $newToken';


        final dio = Dio();
        final cloneReq = await dio.fetch(opts);
        handler.resolve(cloneReq);
        return;
      } catch (e) {
        if (!ApiHandler.isRedirecting) {
          ApiHandler.isRedirecting = true;
          ApiHandler.cancelAllRequests("Cancel All Requests - Unauthorized");
          // TODO: Navigate to login
          Get.offAllNamed('/login');
        }
        handler.reject(err);
      } finally {
        ApiHandler.isRefreshing = false;
      }
    } else if (err.type == DioExceptionType.cancel) {

      handler.next(err);
    } else {
      handler.next(err);
    }
  }
}