import 'package:flutter/cupertino.dart'; import 'package:google_sign_in/google_sign_in.dart'; import 'package:http/http.dart' as http; import 'dart:convert'; import 'package:insparkspokalen_ui/models/userModel.dart'; import 'package:insparkspokalen_ui/api_endpoints.dart'; // import 'package:shared_preferences/shared_preferences.dart'; import '../googleAuthService.dart'; import '../image_service.dart'; /// Api docs UserMS /// https://group-10-15.pvt.dsv.su.se/user/swagger-ui/index.html class UserService { late UserModel user; Future> showUsers() async { try { final response = await http.get(ApiEndPoints.userAll); if (response.statusCode == 200) { final List data = jsonDecode(response.body); return data.map((json) => UserModel.fromJson(json)).toList(); } else { return []; } } catch (e) { print("Error fetching users: $e"); return []; } } Future createOrFetchUser(GoogleSignInAccount account) async { String googleEmail = account.email; try { if (await fetchExistingUser(googleEmail)) { // user exists in backend -> set user, check profile picture and return print("User fetched: ${user.toJson()}"); if (await isDefaultGoogleAvatar(user.profilePicture)) { // if default google profile set random dicebear avatar and update in backend await updateProfilePicture(user.email, await ImageService().diceStyleToStorageUrl('avataaars-neutral')); } GoogleAuthService.setCurrentUser(user); // update locally print('UserService DEBUG: googleauthuser = ${GoogleAuthService.getCurrentUser()?.teamId}'); return; } // User doesn't exist -> create userModel String? profilePicture = await (await isDefaultGoogleAvatar(account.photoUrl) ? await ImageService().diceStyleToStorageUrl('avataaars-neutral') : Future.value(account.photoUrl)); user = UserModel( googleEmail, account.displayName ?? 'Unknown', profilePicture, 0, ); if (await createUserBackend(user)) { print("User created: ${user.toJson()}"); GoogleAuthService.setCurrentUser(user); } else { throw Exception("Failed to create user in backend"); } } catch (e) { print("UserService error: $e"); } } /// If user exists in backend the method will, /// Set this.user to the user from the backend /// return true Future fetchExistingUser(String email) async { final getUserResponse = await http.get(ApiEndPoints.userGetUserByEmail(email)); if (getUserResponse.statusCode == 200 && getUserResponse.body.isNotEmpty) { user = UserModel.fromJson(jsonDecode(getUserResponse.body)); print('UserService DEBUG: Fetched user from backend: ${user.toJson()}'); return true; } return false; } Future createUserBackend(UserModel user) async { final getUserResponse = await http.post( ApiEndPoints.userCreate, headers: {'Content-Type': 'application/json'}, body: jsonEncode(user.toJson()), ); user = UserModel.fromJson(jsonDecode(getUserResponse.body)); return getUserResponse.statusCode == 200 || getUserResponse.statusCode == 201; } static Future getUserRole(String email) async { final response = await http.get(ApiEndPoints.userGetRoleByEmail(email)); if (response.statusCode == 200) { return response.body.replaceAll('"', '').toUpperCase(); } else { throw Exception("Failed to retrieve role for $email"); } } Future getUserByEmail(String email) async { final response = await http.get(ApiEndPoints.userGetUserByEmail(email)); if (response.statusCode == 200) { return UserModel.fromJson(jsonDecode(response.body)); } else { throw Exception('Failed to load user'); } } Future addTeamToUser(int teamId) async { user = GoogleAuthService.getCurrentUser()!; final response = await http.post( ApiEndPoints.userJoinTeam, headers: {'Content-Type': 'application/json'}, body: jsonEncode({'email': user?.email, 'teamId': teamId}), ); bool success = response.statusCode == 200 || response.statusCode == 201; if (success) { user.teamId = teamId; GoogleAuthService.setCurrentUser(user); } return success; } Future userResetTeamByEmail(String email) async { final response = await http.put(ApiEndPoints.userResetTeamByEmail(email)); return response.statusCode == 200 || response.statusCode == 201; } Future fetchProfilePicture(String email) async { final response = await http.get(ApiEndPoints.userGetProfilePictureByEmail(email)); if (response.statusCode == 200) { return response.body.replaceAll('"', ''); } else { return null; } } Future getUserTeamByEmail(String email) async { final response = await http.get(ApiEndPoints.userGetTeamByEmail(email)); user = UserModel.fromJson(jsonDecode(response.body)); if (response.statusCode == 200) { return user?.teamId; } else { print('Kunde inte hämta teamId för användare: ${response.statusCode}'); return 0; } } Future userInTeam(String email) async { final userTeamId = await getUserTeamByEmail(email); print('UserService DEBUG: userInTeam: userTeamId = $userTeamId'); // todo remove debug final bool userInTeam = userTeamId != 0 && userTeamId != null; return userInTeam; } Future updateProfilePicture(String email, String imageUrl) async { final response = await http.put( ApiEndPoints.userChangePictureByEmail(email), headers: {'Content-Type': 'application/json'}, body: jsonEncode({ 'imageUrl': imageUrl }), ); return response.statusCode == 200; } static Future isDefaultGoogleAvatar(String? photoUrl) async { if (photoUrl == null || photoUrl.isEmpty) return true; try { final response = await http.head(Uri.parse(photoUrl)); final contentType = response.headers['content-type']; print('Content type: ${contentType == 'image/png'}'); return contentType == 'image/png'; // Defaults are PNG } catch (e) { // Fail safe: assume default if request fails return true; } } }