initHttpClient function

void initHttpClient()

Implementation

void initHttpClient() {
  final cfg = getConfig();

  if (cfg.apiUrl.isEmpty ||
      cfg.secretKey.isEmpty ||
      cfg.apiKey.isEmpty ||
      cfg.verificationId.isEmpty) {
    throw StateError(
      'HttpClient: Configuración de inicialización incompleta. Llama a apacuana.init() primero.',
    );
  }

  _dio = Dio(
    BaseOptions(
      baseUrl: cfg.apiUrl,
      headers: {
        'APACUANA-API-Key': cfg.apiKey,
        'APACUANA-SECRET-Key': cfg.secretKey,
      },
      connectTimeout: const Duration(milliseconds: 30000),
      receiveTimeout: const Duration(milliseconds: 30000),
      sendTimeout: const Duration(milliseconds: 30000),
      responseType: ResponseType.json,
    ),
  );

  // Interceptores para traducir errores y validar respuestas lógicas { success: false }
  _dio!.interceptors.add(
    InterceptorsWrapper(
      onResponse: (response, handler) {
        final data = response.data;
        if (data is Map && data['success'] == false) {
          final message = (data['msg'] ??
                  data['message'] ??
                  'Error lógico desconocido desde la API.')
              .toString();
          final code = (data['code'] ?? 'LOGICAL_API_ERROR').toString();
          final status = response.statusCode ?? 200;
          final apiErr = ApacuanaAPIError(
            message,
            statusCode: status,
            errorCode: code,
          );
          return handler.reject(
            DioException(
              requestOptions: response.requestOptions,
              response: response,
              error: apiErr,
              type: DioExceptionType.badResponse,
            ),
          );
        }
        handler.next(response);
      },
      onError: (e, handler) {
        // Log de error similar a console.error del JS
        // ignore: avoid_print
        print(
            '[HTTP Client] Interceptor de error de Dio: ${e.response ?? e.message}');

        if (e.response != null) {
          final status = e.response!.statusCode ?? 0;
          final data = e.response!.data;
          String message = 'Error desconocido desde la API.';
          String code = 'API_ERROR';
          if (data is Map) {
            message = (data['msg'] ?? data['message'] ?? message).toString();
            code = (data['code'] ?? code).toString();
          }
          final apiErr = ApacuanaAPIError(
            message,
            statusCode: status,
            errorCode: code,
          );
          return handler.reject(
            DioException(
              requestOptions: e.requestOptions,
              response: e.response,
              error: apiErr,
              type: DioExceptionType.badResponse,
            ),
          );
        }

        // Errores de red / timeouts / CORS-like (en entornos web)
        if (e.type == DioExceptionType.connectionTimeout ||
            e.type == DioExceptionType.sendTimeout ||
            e.type == DioExceptionType.receiveTimeout ||
            e.type == DioExceptionType.connectionError) {
          final apiErr = ApacuanaAPIError(
            'Error de conexión a la red, timeout o CORS.',
            statusCode: 0,
            errorCode: 'NETWORK_ERROR',
          );
          return handler.reject(
            DioException(
              requestOptions: e.requestOptions,
              error: apiErr,
              type: e.type,
            ),
          );
        }

        // Desconocido al configurar la petición
        final apiErr = ApacuanaAPIError(
          'Error desconocido en la petición: ${e.message}',
          statusCode: 0,
          errorCode: 'UNKNOWN_REQUEST_ERROR',
        );
        return handler.reject(
          DioException(
            requestOptions: e.requestOptions,
            error: apiErr,
            type: e.type,
          ),
        );
      },
    ),
  );
}