import 'dart:io';
import 'dart:math';

import 'package:backend/service/db_access.dart';
import 'package:dart_frog/dart_frog.dart';
import 'package:logging/logging.dart';
import 'package:shared_models/room.dart';

final log = Logger('create_room/');

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

  try {
    // Generate a random 6-letter room code
    const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    final random = Random();
    final roomCode = String.fromCharCodes(
      Iterable.generate(
        6,
        (_) => chars.codeUnitAt(random.nextInt(chars.length)),
      ),
    );

    // Create the room
    final room = await Db.createRoom(roomCode: roomCode);

    if (room == null) {
      return Response.json(
        statusCode: HttpStatus.internalServerError,
        body: CreateRoomResponse(
          error: 'Unexpected error: unable to create room',
          success: false,
          roomCode: null,
        ).toJson(),
      );
    }

    // Return the room code
    return Response.json(
      body: CreateRoomResponse(success: true, roomCode: room.code).toJson(),
    );
  } catch (e) {
    log.severe('Error:', e);
    return Response.json(
      statusCode: HttpStatus.internalServerError,
      body: CreateRoomResponse(success: false, roomCode: null, error: 'Internal server error').toJson(),
    );
  }
}