import 'package:flutter/material.dart';
import 'package:flutter_markdown/flutter_markdown.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';
import 'package:flutter/services.dart';

const String openAiApiKey = 'openaiapikey'; // Ваш API ключ
const String model = 'o1-preview'; // Модель, которую хотите использовать
const String appVersion = '1.0.0'; // Версия приложения

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

class OpenAIChatApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'OpenAI Chat',
      theme: ThemeData.dark().copyWith(
        primaryColor: Colors.black,
        hintColor: Colors.blueAccent, // Добавляем акцентный цвет
        scaffoldBackgroundColor: Colors.black,
        textTheme: TextTheme(
          bodyMedium: TextStyle(fontSize: 14), // Убедиться, что размер шрифта установлен
        ),
      ),
      home: ChatListScreen(),
    );
  }
}

class ChatListScreen extends StatefulWidget {
  @override
  _ChatListScreenState createState() => _ChatListScreenState();
}

class _ChatListScreenState extends State<ChatListScreen> {
  List<List<Map<String, String>>> _chats = []; // История всех чатов
  List<List<Map<String, String>>> _filteredChats = [];
  TextEditingController _searchController = TextEditingController();
  bool _isSearching = false;

  void _createNewChat() {
    setState(() {
      _chats.add([]);
      _filteredChats = _chats;
    });
    _openChat(_chats.length - 1);
  }

  void _openChat(int index) {
    Navigator.push(
      context,
      MaterialPageRoute(
        builder: (context) => ChatScreen(
          messages: _chats[index],
        ),
      ),
    );
  }

  void _showInfoDialog() {
    showDialog(
      context: context,
      builder: (BuildContext context) {
        return AlertDialog(
          title: Text('Информация', style: TextStyle(color: Colors.white)),
          content: Text(
            'Версия приложения: $appVersion\n'
            'Модель: $model\n'
            'Это приложение для взаимодействия с OpenAI.',
            style: TextStyle(color: Colors.white70),
          ),
          backgroundColor: Colors.grey[900],
          actions: [
            TextButton(
              child: Text('Закрыть', style: TextStyle(color: Colors.blueAccent)),
              onPressed: () {
                Navigator.of(context).pop();
              },
            ),
          ],
        );
      },
    );
  }

  void _searchChats(String query) {
    final results = _chats.where((chat) {
      return chat.any((message) => message['content']!.toLowerCase().contains(query.toLowerCase()));
    }).toList();

    setState(() {
      _filteredChats = results;
    });
  }

  @override
  void initState() {
    super.initState();
    _filteredChats = _chats;
    _searchController.addListener(() {
      _searchChats(_searchController.text);
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: !_isSearching
            ? Text('Manage Chats')
            : TextField(
                controller: _searchController,
                style: TextStyle(color: Colors.white),
                decoration: InputDecoration(
                  hintText: 'Поиск...',
                  hintStyle: TextStyle(color: Colors.white70),
                  border: InputBorder.none,
                ),
              ),
        actions: [
          !_isSearching
              ? IconButton(
                  icon: Icon(Icons.search),
                  onPressed: () {
                    setState(() {
                      _isSearching = true;
                    });
                  })
              : IconButton(
                  icon: Icon(Icons.cancel),
                  onPressed: () {
                    setState(() {
                      _isSearching = false;
                      _searchController.clear();
                      _filteredChats = _chats;
                    });
                  }),
          IconButton(
            icon: Icon(Icons.add),
            onPressed: _createNewChat,
          ),
          IconButton(
            icon: Icon(Icons.info_outline),
            onPressed: _showInfoDialog,
          ),
        ],
      ),
      body: _filteredChats.isEmpty
          ? Center(
              child: Text(
                'No chats yet. Start a new one!',
                style: TextStyle(color: Colors.white54),
              ),
            )
          : ListView.builder(
              itemCount: _filteredChats.length,
              itemBuilder: (context, index) {
                return ListTile(
                  title: Text('Chat ${index + 1}', style: TextStyle(color: Colors.white)),
                  onTap: () => _openChat(index),
                );
              },
            ),
    );
  }
}

class ChatScreen extends StatefulWidget {
  final List<Map<String, String>> messages;

  ChatScreen({required this.messages});

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

class _ChatScreenState extends State<ChatScreen> {
  final TextEditingController _controller = TextEditingController();
  final ScrollController _scrollController = ScrollController();

  Future<void> _sendMessage(String message) async {
    if (message.isEmpty) return;

    if (mounted) {
      setState(() {
        widget.messages.add({'user': 'You', 'content': message});
      });
      _scrollToBottom(); // Прокручиваем вниз
    }

    final response = await http.post(
      Uri.parse('https://api.openai.com/v1/chat/completions'),
      headers: {
        'Authorization': 'Bearer $openAiApiKey',
        'Content-Type': 'application/json',
      },
      body: jsonEncode({
        'model': model,
        'messages': [
          // {'role': 'system', 'content': 'Отвечай на русском языке.'},  // Инструкция отвечать на русском
          {'role': 'user', 'content': message}
        ],
        'temperature': 1.0,
      }),
    );

    if (response.statusCode == 200) {
      final data = jsonDecode(utf8.decode(response.bodyBytes));  // Decode with utf8
      final reply = data['choices'][0]['message']['content'];
      if (mounted) {
        setState(() {
          widget.messages.add({'user': 'AI', 'content': reply});
        });
        _scrollToBottom(); // Прокручиваем вниз после ответа AI
      }
    } else {
      if (mounted) {
        setState(() {
          widget.messages.add({'user': 'AI', 'content': 'Ошибка: не удалось получить ответ.'});
        });
        _scrollToBottom(); // Прокручиваем вниз при ошибке AI
      }
    }
  }

  void _scrollToBottom() {
    WidgetsBinding.instance.addPostFrameCallback((_) {
      if (_scrollController.hasClients) {
        _scrollController.animateTo(
          _scrollController.position.maxScrollExtent,
          duration: Duration(milliseconds: 300),
          curve: Curves.easeOut,
        );
      }
    });
  }

  Widget _buildMessage(String user, String content) {
    final textColor = user == 'You' ? Colors.blueAccent : Colors.white70;

    return Container(
      margin: EdgeInsets.symmetric(vertical: 4.0, horizontal: 8.0),
      padding: EdgeInsets.all(8.0),
      decoration: BoxDecoration(
        color: Colors.black87,
        borderRadius: BorderRadius.circular(8.0),
        border: Border.all(color: textColor.withOpacity(0.5)),
      ),
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.stretch,
        children: [
          MarkdownBody(
            data: content,
            styleSheet: MarkdownStyleSheet(
              p: TextStyle(color: textColor),
              code: TextStyle(color: Colors.lightGreenAccent, fontFamily: 'monospace', fontSize: 14),
              textScaleFactor: 1.0,
            ),
          ),
          Align(
            alignment: Alignment.topRight,
            child: IconButton(
              icon: Icon(Icons.copy, color: Colors.white70, size: 18),
              onPressed: () {
                Clipboard.setData(ClipboardData(text: content));
                ScaffoldMessenger.of(context).showSnackBar(
                  SnackBar(content: Text('Ответ скопирован')),
                );
              },
            ),
          ),
        ],
      ),
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Chat'),
        leading: IconButton(
          icon: Icon(Icons.arrow_back),
          onPressed: () {
            Navigator.pop(context);
          },
        ),
      ),
      body: Column(
        children: <Widget>[
          Expanded(
            child: ListView.builder(
              controller: _scrollController, // Используем контроллер прокрутки
              itemCount: widget.messages.length,
              itemBuilder: (context, index) {
                final msg = widget.messages[index];
                return Padding(
                  padding: const EdgeInsets.symmetric(horizontal: 8.0),
                  child: _buildMessage(msg['user']!, msg['content']!),
                );
              },
            ),
          ),
          Divider(color: Colors.white30),
          Container(
            padding: const EdgeInsets.all(8.0),
            decoration: BoxDecoration(
              color: Colors.black87,
            ),
            child: Row(
              children: <Widget>[
                Expanded(
                  child: TextField(
                    controller: _controller,
                    style: TextStyle(color: Colors.white),
                    decoration: InputDecoration(
                      hintText: 'Введите сообщение...',
                      hintStyle: TextStyle(color: Colors.white54),
                      enabledBorder: OutlineInputBorder(
                        borderSide: BorderSide(color: Colors.black45),
                        borderRadius: BorderRadius.circular(12.0),
                      ),
                      focusedBorder: OutlineInputBorder(
                        borderSide: BorderSide(color: Colors.white),
                        borderRadius: BorderRadius.circular(12.0),
                      ),
                      filled: true,
                      fillColor: Colors.black54,
                    ),
                    onSubmitted: (value) {
                      _sendMessage(value);
                      _controller.clear();
                    },
                  ),
                ),
                SizedBox(width: 8),
                IconButton(
                  icon: Icon(Icons.send, color: Colors.blueAccent),
                  onPressed: () {
                    _sendMessage(_controller.text);
                    _controller.clear();
                  },
                ),
              ],
            ),
          ),
        ],
      ),
    );
  }
}

вот мое приложение. добавь туда регистрацию, логин, профиль, и удаление и выход из аккаунта. сам поймешь что приложение делает. через mysql бд все будет через посредника на nodejs