import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:frontend/providers/auth.dart';
import 'package:frontend/providers/game_messages.dart';
import 'package:frontend/providers/web_socket.dart';
import 'package:go_router/go_router.dart';
import 'package:logging/logging.dart';
import 'package:shared_models/room.dart';

final logger = Logger('GameRoomHome');

class GameRoomHome extends ConsumerStatefulWidget {
  const GameRoomHome({super.key, this.roomUuid});

  final String? roomUuid;

  @override
  ConsumerState<GameRoomHome> createState() => _GameRoomHomeState();
}

class _GameRoomHomeState extends ConsumerState<GameRoomHome> {
  @override
  void initState() {
    WidgetsBinding.instance.addPostFrameCallback((_) => ref.read(webSocketNotifierProvider.notifier).connect());
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    final jwt = ref.watch(jwtBodyProvider);
    if (jwt == null || jwt.roomUuid != widget.roomUuid) {
      logger.fine('Tried to open room, but not authenticated / wrong room');
      // return home
      WidgetsBinding.instance.addPostFrameCallback((_) => context.go('/'));
    }

    final connection = ref.watch(webSocketNotifierProvider).valueOrNull;

    if (jwt != null) {
      ref.listen(
        gameMessageNotifierProvider,
        (previous, next) {
          final message = next.valueOrNull;
          if (message is GameRoomMessage) {
            switch (message) {
              case PingMessage():
                final ping = PingMessage.now(
                  jwt.roomUuid,
                  dest: PingDestination.server,
                  userUuid: jwt.uuid,
                );
                ref.read(webSocketNotifierProvider.notifier).sendMessage(ping);
              case PlayerVoteMessage():
                // TODO: Handle this case.
                throw UnimplementedError();
            }
          }
        },
      );
    }
    // enstablish ws connection at /room/roomCode/ws and save to gameMessageProvider
    return Scaffold(
      body: Column(
        children: [
          Text('Authenticated.'),
          Text('Welcome to room ${widget.roomUuid}'),
          ElevatedButton(
              onPressed: connection == null
                  ? null
                  : () {
                      connection.add('Test message');
                    },
              child: Text('Send message on socket')),
        ],
      ),
    );
  }
}