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() as Map<String, dynamic>;
    final createUserReq = CreateUserRequest.fromJson(body);

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

    if (token == null || user == null) {
      final body = CreateUserResponse(
        success: false,
        token: null,
        error: user == null ? 'Room ${createUserReq.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,
    );
  }
}