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

import '../../api/apiResponse.dart';
import '../../api/marianumcloud/talk/chat/getChatCache.dart';
import '../../api/marianumcloud/talk/chat/getChatResponse.dart';
import '../../storage/base/settingsProvider.dart';
import '../dataHolder.dart';

class ChatProps extends DataHolder {
  String _queryToken = '';
  DateTime _lastTokenSet = DateTime.now();
  int? _referenceMessageId;

  GetChatResponse? _getChatResponse;
  GetChatResponse get getChatResponse => _getChatResponse!;

  int? get getReferenceMessageId => _referenceMessageId;
  set unsafeInternalSetReferenceMessageId(int? reference) => _referenceMessageId = reference;

  @override
  List<ApiResponse?> properties() => [_getChatResponse];

  @override
  void run() {
    notifyListeners();
    if(_queryToken.isEmpty) return;
    var requestStart = DateTime.now();

    GetChatCache(
      chatToken: _queryToken,
      onUpdate: (GetChatResponse data) {
        if(_lastTokenSet.isAfter(requestStart)) return; // Another request was faster

        _getChatResponse = data;
        notifyListeners();
      }
    );
  }

  void setReferenceMessageId(int? messageId, BuildContext context, String sendToToken) {
    Future.microtask(() {
      _referenceMessageId = messageId;
      notifyListeners();

      var settings = Provider.of<SettingsProvider>(context, listen: false);
      if(messageId != null) {
        settings.val(write: true).talkSettings.draftReplies[sendToToken] = messageId;
      } else {
        settings.val(write: true).talkSettings.draftReplies.removeWhere((key, value) => key == sendToToken);
      }
    });
  }

  void setQueryToken(String token) {
    _queryToken = token;
    _getChatResponse = null;
    _lastTokenSet = DateTime.now();
    run();
  }

  String currentToken() => _queryToken;
}