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('auth/');

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 = await authenticator.generateToken(createUserReq);

    if (token == null) {
      final body = CreateUserResponse(
        success: false,
        token: null,
        error: 'Room ${createUserReq.roomCode} requested is not available',
      ).toJson();
      return Response.json(
        statusCode: HttpStatus.badRequest,
        body: body,
      );
    }

    // Return the token
    return Response.json(
      body: CreateUserResponse(token: token, success: true).toJson(),
    );
    // }
    //  on JWTParseException {
    //   return Response.json(
    //     statusCode: HttpStatus.badRequest,
    //     body: {'error': 'Username is required'},
    //   );
  } catch (e) {
    log.severe('Error:', e);
    final body = CreateUserResponse(success: false, token: null, error: 'Internal server error').toJson();
    return Response.json(
      statusCode: HttpStatus.internalServerError,
      body: body,
    );
  }
}