import 'dart:io';

import 'package:backend/authenticator.dart';
import 'package:dart_frog/dart_frog.dart';
import 'package:logging/logging.dart';
import 'package:shared_models/user.dart';

final log = Logger('join_room/');

Future<Response> onRequest(RequestContext context) async {
  // Only allow POST requests
  if (context.request.method != HttpMethod.post) {
    return Response(statusCode: HttpStatus.methodNotAllowed);
  }

  try {
    // Parse the request body
    final body = await context.request.json();
    final joinRoomRequest = JoinRoomRequest.fromJson(body as Map<String, dynamic>);

    // Generate token
    final authenticator = context.read<Authenticator>();
    final (token, user) = await authenticator.generateToken(joinRoomRequest);

    if (token == null || user == null) {
      final body = CreateUserResponse(
        success: false,
        token: null,
        error:
            user == null ? 'Room ${joinRoomRequest.roomCode} requested is not available' : 'Unexpected error occurred',
        uuid: null,
      ).toJson();
      return Response.json(
        statusCode: user == null ? HttpStatus.badRequest : HttpStatus.internalServerError,
        body: body,
      );
    }

    // Return the token
    return Response.json(
      body: CreateUserResponse(token: token, success: true, uuid: user.uuid).toJson(),
    );
  } catch (e) {
    log.severe('Error:', e, StackTrace.current);
    final body = CreateUserResponse(success: false, token: null, error: 'Internal server error', uuid: null).toJson();
    return Response.json(
      statusCode: HttpStatus.internalServerError,
      body: body,
    );
  }
}