import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:frontend/providers/auth.dart';
import 'package:frontend/providers/dio.dart';
import 'package:logging/logging.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:shared_models/user.dart';

part 'game_room.g.dart';

final logger = Logger('services/joinRoom');

@riverpod
Future<JoinRoomResponse?> joinRoom(Ref ref, {required String username, required String code}) async {
  final dio = ref.read(dioProvider);

  try {
    final response = await dio.post<Map<String, dynamic>>(
      '/join_room',
      data: JoinRoomRequest(username: username, roomCode: code).toJson(),
    );

    if (response.statusCode == 200 && response.data != null) {
      final joinResponse = JoinRoomResponse.fromJson(response.data!);
      if (joinResponse.token != null) {
        logger.fine('Setting token: ${joinResponse.token!.substring(10)}');
        await ref.read(jwtNotifierProvider.notifier).setJwt(joinResponse.token!);
      }
      return joinResponse;
    } else {
      logger.warning('Could not join room');
    }
  } catch (e) {
    logger.severe('Failed to join room', e, StackTrace.current);
    return null;
  }
  return null;
}