import 'dart:convert';

import 'package:backend/service/db_access.dart';
import 'package:http/http.dart' as http;
import 'package:shared_models/room.dart';
import 'package:shared_models/user.dart';
import 'package:test/test.dart';

void main() {
  const baseUrl = 'http://localhost:8080'; // Adjust as needed

  test('Complete room creation and ping flow', () async {
    // 1. Create Room
    final createRoomResponse = await http.post(
      Uri.parse('$baseUrl/create_room'),
    );

    expect(createRoomResponse.statusCode, 200);

    final createRoomData = CreateRoomResponse.fromJson(
      json.decode(createRoomResponse.body) as Map<String, dynamic>,
    );
    expect(createRoomData.success, true);
    expect(createRoomData.roomCode, isNotNull);

    final roomCode = createRoomData.roomCode!;

    // 2. Join Room
    final joinRoomResponse = await http.post(
      Uri.parse('$baseUrl/join_room'),
      body: jsonEncode(JoinRoomRequest(username: 'testUser123', roomCode: createRoomData.roomCode!).toJson()),
      headers: {'Content-Type': 'application/json'},
    );

    expect(joinRoomResponse.statusCode, 200);

    final joinRoomData = JoinRoomResponse.fromJson(
      json.decode(joinRoomResponse.body) as Map<String, dynamic>,
    );
    expect(joinRoomData.success, true);
    expect(joinRoomData.token, isNotNull);
    expect(joinRoomData.uuid, isNotNull);

    final token = joinRoomData.token!;

    // 3. Ping Room
    final pingResponse = await http.get(
      Uri.parse('$baseUrl/room/$roomCode/ping'),
      headers: {
        'Authorization': 'Bearer $token',
      },
    );

    expect(pingResponse.statusCode, 200);

    final testUser = await Db.getUserById(joinRoomData.uuid!);
    expect(testUser, isNotNull);
    expect(testUser!.uuid, joinRoomData.uuid);

    final gameRoom = await Db.getRoomByCode(createRoomData.roomCode);
    expect(gameRoom, isNotNull);
    expect(gameRoom!.code, createRoomData.roomCode);
  });
}