import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

import 'package:hangman/provider/data.dart';
import 'package:hangman/screens/game.dart';
import 'package:hangman/utils/constants.dart';
import 'package:hangman/widgets/dialog_fetch_error.dart';
import 'package:hangman/widgets/my_app_bar.dart';

class Home extends StatelessWidget {
  const Home({super.key});

  static const String id = 'home';

  @override
  Widget build(BuildContext context) {
    final Data myProvider = Provider.of<Data>(context);

    void errorWord(context) {
      showDialog(
        context: context,
        builder: (_) => AlertDialog(
          title: const Text('Erreur inattendue'),
          content: const Text('Erreur inattendue à la récupération d\'un mot aléatoire.\n'
              'Installer une nouvelle version de l\'application pourrait corriger cette anomalie.'),
          actions: <Widget>[
            TextButton(
              child: const Text('Fermer'),
              onPressed: () => Navigator.of(context).pop(),
            )
          ],
        ),
      );
    }

    return Scaffold(
      appBar: MyAppBar(appBar: AppBar()),
      body: Builder(
        builder: (context) => Center(
          child: myProvider.searching == true
              ? PopScope(
                  onPopInvoked: (didPop) {},
                  child: const Center(
                    child: CircularProgressIndicator(),
                  ),
                )
              : SingleChildScrollView(
                  padding: const EdgeInsets.all(15.0),
                  child: SizedBox(
                    height: MediaQuery.of(context).size.height / 1.25,
                    child: Column(
                      mainAxisAlignment: MainAxisAlignment.spaceAround,
                      children: [
                        Padding(
                          padding:
                              const EdgeInsets.symmetric(horizontal: 20.0, vertical: 10.0),
                          child: FittedBox(
                            fit: BoxFit.fitWidth,
                            child: Text(
                              'LE PENDU',
                              style: TextStyle(
                                fontFamily: 'Tiza',
                                fontSize: 28.0,
                                color: Colors.grey[700],
                              ),
                            ),
                          ),
                        ),
                        Column(
                          children: [
                            Row(
                              mainAxisAlignment: MainAxisAlignment.spaceBetween,
                              children: [
                                const Text('Mode en ligne'),
                                Switch(
                                  value: myProvider.gameModeValue,
                                  onChanged: (bool value) => myProvider.updateGameMode = value,
                                  activeTrackColor: const Color(board),
                                  activeColor: Colors.greenAccent[400],
                                ),
                              ],
                            ),
                            Row(
                              mainAxisAlignment: MainAxisAlignment.spaceBetween,
                              children: [
                                const Text('Niveau'),
                                DropdownButton<String>(
                                  value: myProvider.levelValue != ''
                                      ? myProvider.levelValue
                                      : onlineGameMode[myProvider.gameModeValue]?.first,
                                  items: onlineGameMode[myProvider.gameModeValue]
                                      ?.map<DropdownMenuItem<String>>((String value) {
                                    return DropdownMenuItem<String>(
                                      value: value,
                                      child: Text(value),
                                    );
                                  }).toList(),
                                  onChanged: (String? value) =>
                                      myProvider.updateLevel = value ?? '',
                                ),
                              ],
                            ),
                          ],
                        ),
                        TextButton.icon(
                          style: TextButton.styleFrom(
                            foregroundColor: Colors.white,
                            backgroundColor: const Color(board),
                            padding: const EdgeInsets.all(20.0),
                          ),
                          onPressed: () async {
                            myProvider.resetGame();
                            myProvider.searching = true;
                            bool control = true;
                            await const Game().pickWord(context, myProvider);
                            if (myProvider.secretWord == '' || myProvider.hiddenWord == '') {
                              control = false;
                              if (!context.mounted) return;
                              var response = await Navigator.push(
                                context,
                                MaterialPageRoute(
                                  builder: (context) => const DialogFetchError(),
                                ),
                              );
                              if (response == false) {
                                myProvider.searching = false;
                                myProvider.resetGame();
                              } else {
                                myProvider.setPrefGameMode = false;
                                myProvider.setPrefLevel = defaultLevel;
                                if (!context.mounted) return;
                                await const Game().pickWord(context, myProvider);
                                control = true;
                              }
                            }

                            if (myProvider.secretWord == 'UNEXPECTED ERROR') {
                              control = false;
                              myProvider.resetGame();
                              if (!context.mounted) return;
                              errorWord(context);
                            }

                            if (control) {
                              if (!context.mounted) return;
                              Navigator.pushNamed(context, Game.id)
                                  .then((value) => myProvider.searching = false);
                            }
                          },
                          icon: const Icon(
                            Icons.check_box,
                            color: Colors.white,
                            size: 60.0,
                          ),
                          label: Column(
                            children: [
                              const Text(
                                'JOUER',
                                style: TextStyle(
                                  fontSize: 22.0,
                                  letterSpacing: 2.0,
                                ),
                              ),
                              Text(
                                'Mode de jeu: ${myProvider.levelPref}',
                                style: const TextStyle(
                                  fontSize: 10.0,
                                  fontWeight: FontWeight.w300,
                                ),
                              ),
                            ],
                          ),
                        ),
                      ],
                    ),
                  ),
                ),
        ),
      ),
    );
  }
}