import 'dart:convert'; import 'package:http/http.dart' as http; import 'package:shared_preferences/shared_preferences.dart'; import '../models/user.dart'; /// Authentication Service class AuthService { // TODO: Implement API connector - configure base URL from env/config static const String _apiBaseUrl = 'http://192.168.2.66:5000'; static const String _tokenKey = 'auth_token'; late SharedPreferences _prefs; Future _initPrefs() async { _prefs = await SharedPreferences.getInstance(); } /// Login with userCode and password Future login({ required int userCode, required String password, }) async { await _initPrefs(); try { final response = await http.post( Uri.parse('$_apiBaseUrl/login'), headers: {'Content-Type': 'application/json'}, body: jsonEncode({ 'userCode': userCode, 'password': password, }), ); if (response.statusCode == 200) { final body = response.body; try { final data = jsonDecode(body) as Map; final authResponse = AuthResponse.fromJson(data); // Store token await _prefs.setString(_tokenKey, authResponse.token); return authResponse; } catch (e) { // Surface the response body to help debug backend field names / formats throw Exception('Login parse error: $e -- response body: $body'); } } else if (response.statusCode == 401) { throw Exception('Invalid credentials'); } else { throw Exception('Login failed: ${response.statusCode}'); } } catch (e) { throw Exception('Login error: $e'); } } /// Get stored token Future getToken() async { await _initPrefs(); return _prefs.getString(_tokenKey); } /// Check if user is logged in Future isLoggedIn() async { final token = await getToken(); return token != null; } /// Logout Future logout() async { await _initPrefs(); await _prefs.remove(_tokenKey); } /// Get Authorization header Future> getAuthHeaders() async { final token = await getToken(); return { 'Authorization': 'Bearer $token', 'Content-Type': 'application/json', }; } }