import '../marianumcloud/talk/talk_error.dart';
import 'app_exception.dart';

class TalkException extends AppException {
  final TalkError source;

  TalkException(this.source, {String? technicalDetails})
    : super(
        userMessage: _mapMessage(source),
        technicalDetails:
            technicalDetails ??
            'Talk ${source.status} (${source.code}): ${source.message}',
        allowRetry: source.code >= 500,
      );

  static String _mapMessage(TalkError e) {
    switch (e.code) {
      case 400:
        return 'Talk hat diese Anfrage abgelehnt. Bitte lade den Chat neu und '
            'versuche es erneut.';
      case 413:
        return 'Diese Nachricht ist zu lang.';
      case 401:
        return 'Bitte melde dich erneut an, um auf Talk zuzugreifen.';
      case 403:
        return 'Du hast keine Berechtigung für diese Talk-Aktion.';
      case 404:
        return 'Dieser Chat existiert nicht oder wurde entfernt.';
      case 412:
        return 'Diese Aktion ist im aktuellen Chat-Zustand nicht erlaubt.';
      case 429:
        return 'Zu viele Anfragen. Bitte kurz warten und erneut versuchen.';
      default:
        if (e.code >= 500) {
          return 'Der Chat-Server konnte die Anfrage gerade nicht verarbeiten. '
              'Bitte versuche es in einem Moment erneut.';
        }
        return e.message.isNotEmpty
            ? e.message
            : 'Talk meldet einen Fehler (${e.code}).';
    }
  }
}
