import 'dart:convert'; import 'package:flutter/foundation.dart'; import 'package:http/http.dart' as http; import '../config/api_config.dart'; import '../models/incoming_question.dart'; import 'auth_service.dart'; /// HTTP client for question queue, answers, and deferrals. class QuestionsApiService { QuestionsApiService({http.Client? client}) : _client = client ?? http.Client(); final http.Client _client; /// Ensures a starter question exists for the signed-in user (login only). Future bootstrapOnLogin() async { final String? token = await AuthService.instance.getIdToken(); if (token == null) { return null; } final http.Response response = await _client.post( Uri.parse('$apiBaseUrl/v1/me/questions/bootstrap'), headers: _authHeaders(token), ); if (response.statusCode != 200) { debugPrint( 'bootstrapOnLogin failed: ${response.statusCode} ${response.body}', ); return null; } final Map body = jsonDecode(response.body) as Map; final Map? questionJson = body['question'] as Map?; if (questionJson == null) { return null; } return IncomingQuestion.fromJson(questionJson); } Future> fetchUnanswered() async { final String? token = await AuthService.instance.getIdToken(); if (token == null) { return []; } final http.Response response = await _client.get( Uri.parse('$apiBaseUrl/v1/me/questions'), headers: _authHeaders(token), ); if (response.statusCode != 200) { debugPrint( 'fetchUnanswered failed: ${response.statusCode} ${response.body}', ); return []; } final Map body = jsonDecode(response.body) as Map; final List raw = body['questions'] as List? ?? []; return raw .map( (dynamic item) => IncomingQuestion.fromJson(item as Map), ) .toList(); } Future submitAnswer({ required String questionId, num answer = 0, }) async { final String? token = await AuthService.instance.getIdToken(); if (token == null) { return null; } final http.Response response = await _client.post( Uri.parse('$apiBaseUrl/v1/me/questions/$questionId/answer'), headers: _authHeaders(token), body: jsonEncode({'answer': answer}), ); if (response.statusCode != 200) { debugPrint( 'submitAnswer failed: ${response.statusCode} ${response.body}', ); return null; } final Map body = jsonDecode(response.body) as Map; return (body['unansweredCount'] as num?)?.toInt(); } Future deferQuestion({required String questionId}) async { final String? token = await AuthService.instance.getIdToken(); if (token == null) { return null; } final http.Response response = await _client.post( Uri.parse('$apiBaseUrl/v1/me/questions/$questionId/defer'), headers: _authHeaders(token), ); if (response.statusCode != 200) { debugPrint( 'deferQuestion failed: ${response.statusCode} ${response.body}', ); return null; } final Map body = jsonDecode(response.body) as Map; return (body['unansweredCount'] as num?)?.toInt(); } Map _authHeaders(String token) { return { 'Authorization': 'Bearer $token', 'Content-Type': 'application/json', 'Accept': 'application/json', }; } }