import 'package:json_annotation/json_annotation.dart';
import 'package:marianum_mobile/api/apiResponse.dart';

import '../chat/getChatResponse.dart';

part 'getRoomResponse.g.dart';

@JsonSerializable(explicitToJson: true)
class GetRoomResponse extends ApiResponse {
  Set<GetRoomResponseObject> data;

  GetRoomResponse(this.data);

  factory GetRoomResponse.fromJson(Map<String, dynamic> json) => _$GetRoomResponseFromJson(json);
  Map<String, dynamic> toJson() => _$GetRoomResponseToJson(this);

  List<GetRoomResponseObject> sortByLastActivity() {
    List<GetRoomResponseObject> sorted = data.toList();
    sorted.sort((a, b) => -a.lastActivity.compareTo(b.lastActivity));
    return sorted;
  }

}

@JsonSerializable(explicitToJson: true)
class GetRoomResponseObject {
  int id;
  String token;
  GetRoomResponseObjectConversationType type;
  String name;
  String displayName;
  String description;
  int participantType;
  int participantFlags;
  int readOnly;
  int listable;
  int lastPing;
  String sessionId;
  bool hasPassword;
  bool hasCall;
  int callFlag;
  bool canStartCall;
  bool canDeleteConversation;
  bool canLeaveConversation;
  int lastActivity;
  bool isFavorite;
  GetRoomResponseObjectParticipantNotificationLevel notificationLevel;
  int unreadMessages;
  bool unreadMention;
  bool unreadMentionDirect;
  int lastReadMessage;
  int lastCommonReadMessage;
  GetChatResponseObject lastMessage;
  String? status;
  String? statusIcon;
  String? statusMessage;

  GetRoomResponseObject(
      this.id,
      this.token,
      this.type,
      this.name,
      this.displayName,
      this.description,
      this.participantType,
      this.participantFlags,
      this.readOnly,
      this.listable,
      this.lastPing,
      this.sessionId,
      this.hasPassword,
      this.hasCall,
      this.callFlag,
      this.canStartCall,
      this.canDeleteConversation,
      this.canLeaveConversation,
      this.lastActivity,
      this.isFavorite,
      this.notificationLevel,
      this.unreadMessages,
      this.unreadMention,
      this.unreadMentionDirect,
      this.lastReadMessage,
      this.lastCommonReadMessage,
      this.lastMessage,
      this.status,
      this.statusIcon,
      this.statusMessage);

  factory GetRoomResponseObject.fromJson(Map<String, dynamic> json) => _$GetRoomResponseObjectFromJson(json);
  Map<String, dynamic> toJson() => _$GetRoomResponseObjectToJson(this);
}

enum GetRoomResponseObjectConversationType {
  @JsonValue(1) oneToOne,
  @JsonValue(2) group,
  @JsonValue(3) public,
  @JsonValue(4) changelog,
  @JsonValue(5) deleted,
}

enum GetRoomResponseObjectParticipantNotificationLevel {
  @JsonValue(0) defaultLevel,
  @JsonValue(1) alwaysNotify,
  @JsonValue(2) notifyOnMention,
  @JsonValue(3) neverNotify,
}

// @JsonSerializable(explicitToJson: true)
// class GetRoomResponseObjectMessage {
//   int id;
//   String token;
//   GetRoomResponseObjectMessageActorType actorType;
//   String actorId;
//   String actorDisplayName;
//   int timestamp;
//   String message;
//   String systemMessage;
//   GetRoomResponseObjectMessageType messageType;
//   bool isReplyable;
//   String referenceId;
//
//
//   GetRoomResponseObjectMessage(
//       this.id,
//       this.token,
//       this.actorType,
//       this.actorId,
//       this.actorDisplayName,
//       this.timestamp,
//       this.message,
//       this.systemMessage,
//       this.messageType,
//       this.isReplyable,
//       this.referenceId);
//
//   factory GetRoomResponseObjectMessage.fromJson(Map<String, dynamic> json) => _$GetRoomResponseObjectMessageFromJson(json);
//   Map<String, dynamic> toJson() => _$GetRoomResponseObjectMessageToJson(this);
// }

enum GetRoomResponseObjectMessageActorType {
  @JsonValue("users") user,
  @JsonValue("guests") guest,
  @JsonValue("bots") bot,
  @JsonValue("bridged") bridge,
}

enum GetRoomResponseObjectMessageType {
  @JsonValue("comment") comment,
  @JsonValue("comment_deleted") deletedComment,
  @JsonValue("system") system,
  @JsonValue("command") command,
}