import 'dart:math';

import 'package:english_words/english_words.dart';
import 'package:flutter/material.dart';
import 'package:flutter_chat_core/flutter_chat_core.dart';
import 'package:flutter_chat_ui/flutter_chat_ui.dart';
import 'package:provider/provider.dart';

void main() {
 runApp(MyApp());
}

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

 @override
 Widget build(BuildContext context) {
   return ChangeNotifierProvider(
     create: (context) => MyAppState(),
     child: MaterialApp(
       title: 'Namer App',
       theme: ThemeData(
         useMaterial3: true,
         colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepOrange),
       ),
       home: MyHomePage(),
     ),
   );
 }
}

class MyAppState extends ChangeNotifier {
 var current = WordPair.random();
 void getNext() {
   current = WordPair.random();
   notifyListeners();
 }

 var favorites = <WordPair>[];

 void toggleFavorite() {
   if (favorites.contains(current)) {
     favorites.remove(current);
   } else {
     favorites.add(current);
   }
   notifyListeners();
 }
}

class MyHomePage extends StatefulWidget {
 @override
 State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
 var selectedIndex = 0;
 @override
 Widget build(BuildContext context) {
   Widget page;
   switch (selectedIndex) {
     case 0:
       page = GeneratorPage();
       break;
     case 1:
       page = FavoritesPage();
       break;
     case 2:
       page = Basic();
       break;
     default:
       throw UnimplementedError('no widget for $selectedIndex');
   }

   return LayoutBuilder(
     builder: (context, constraints) {
       return Scaffold(
         body: Row(
           children: [
             SafeArea(
               child: NavigationRail(
                 extended: constraints.maxWidth >= 600, // ← Here.
                 destinations: [
                   NavigationRailDestination(
                     icon: Icon(Icons.home),
                     label: Text('Home'),
                   ),
                   NavigationRailDestination(
                     icon: Icon(Icons.favorite),
                     label: Text('Favorites'),
                   ),
                   NavigationRailDestination(
                     icon: Icon(Icons.chat),
                     label: Text('llm'),
                   ),
                 ],
                 selectedIndex: selectedIndex,
                 onDestinationSelected: (value) {
                   setState(() {
                     selectedIndex = value;
                   });
                 },
               ),
             ),
             Expanded(
               child: Container(
                 color: Theme.of(context).colorScheme.primaryContainer,
                 child: page,
               ),
             ),
           ],
         ),
       );
     },
   );
 }
}

// ...

class FavoritesPage extends StatelessWidget {
 @override
 Widget build(BuildContext context) {
   var appState = context.watch<MyAppState>();

   if (appState.favorites.isEmpty) {
     return Center(child: Text('No favorites yet.'));
   }

   return ListView(
     children: [
       Padding(
         padding: const EdgeInsets.all(20),
         child: Text(
           'You have '
           '${appState.favorites.length} favorites:',
         ),
       ),
       for (var pair in appState.favorites)
         ListTile(
           leading: Icon(Icons.favorite),
           title: Text(pair.asLowerCase),
         ),
     ],
   );
 }
}

class GeneratorPage extends StatelessWidget {
 @override
 Widget build(BuildContext context) {
   var appState = context.watch<MyAppState>();
   var pair = appState.current;

   IconData icon;
   if (appState.favorites.contains(pair)) {
     icon = Icons.favorite;
   } else {
     icon = Icons.favorite_border;
   }

   return Center(
     child: Column(
       mainAxisAlignment: MainAxisAlignment.center,
       children: [
         BigCard(pair: pair),
         SizedBox(height: 10),
         Row(
           mainAxisSize: MainAxisSize.min,
           children: [
             ElevatedButton.icon(
               onPressed: () {
                 appState.toggleFavorite();
               },
               icon: Icon(icon),
               label: Text('Like'),
             ),
             SizedBox(width: 10),
             ElevatedButton(
               onPressed: () {
                 appState.getNext();
               },
               child: Text('Next'),
             ),
           ],
         ),
       ],
     ),
   );
 }
}

class BigCard extends StatelessWidget {
 const BigCard({super.key, required this.pair});

 final WordPair pair;

 @override
 Widget build(BuildContext context) {
   final theme = Theme.of(context);
   final style = theme.textTheme.displayMedium!.copyWith(
     color: theme.colorScheme.onPrimary,
   );
   return Card(
     color: theme.colorScheme.primary,
     child: Padding(
       padding: const EdgeInsets.all(20.0),
       child: Text(
         pair.asLowerCase,
         style: style,
         semanticsLabel: "${pair.first} ${pair.second}",
       ),
     ),
   );
 }
}

class Basic extends StatefulWidget {
 const Basic({super.key});

 @override
 BasicState createState() => BasicState();
}

class BasicState extends State<Basic> {
 final _chatController = InMemoryChatController();

 @override
 void dispose() {
   _chatController.dispose();
   super.dispose();
 }

 @override
 Widget build(BuildContext context) {
   return Scaffold(
     body: Chat(
       chatController: _chatController,
       currentUserId: 'user1',
       onMessageSend: (text) {
         _chatController.insertMessage(
           TextMessage(
             // Better to use UUID or similar for the ID - IDs must be unique
             id: '${Random().nextInt(1000) + 1}',
             authorId: 'user1',
             createdAt: DateTime.now().toUtc(),
             text: text,
           ),
         );
       },
       resolveUser: (UserID id) async {
         return User(id: id, name: 'John Doe');
       },
     ),
   );
 }
}