import 'package:json_annotation/json_annotation.dart';

import '../../../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> sortBy({bool lastActivity = true, required bool favoritesToTop, required bool unreadToTop}) {
    return data.toList()..sort((a, b) {

      // Unread messages
      if(unreadToTop) {
        int unreadStatus = b.unreadMessages.compareTo(a.unreadMessages);
        if(unreadStatus != 0) return unreadStatus;
      }

      // Favorites
      if(favoritesToTop) if(a.isFavorite) return -1;

      // Activity
      return b.lastActivity.compareTo(a.lastActivity);
    });
  }
}

@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("deleted_users") deletedUsers,
  @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,
}