import 'package:flutter/material.dart';

class FriendSetting {
  String friendRemark = '';
  String friendGroup = '';

  FriendSetting.fromJson(Map json) {
    friendRemark = json['friendRemark'] ?? '';
    friendGroup = json['friendGroup'] ?? '我的好友';
  }
}

class GroupChatSetting {
  String nameRemark = '';
  String myRemark = '';

  GroupChatSetting.fromJson(Map<String, dynamic> json) {
    nameRemark = json['nameRemark'] ?? '';
    myRemark = json['myRemark'] ?? '';
  }
}

class Contact extends ChangeNotifier {
  Map<String, FriendSetting> friends = {};
  List<String> friendGroups = [];
  Map<String, GroupChatSetting> groupChats = {};
  String defaultGroup = '';
  int friendCount = 0;
  int groupChatCount = 0;

  void init(Map json) {
    defaultGroup = json['defaultGroup'];
    friendCount = 0;
    groupChatCount = 0;

    json['friends'].forEach((key, value) {
      friendCount += 1;
      friends[key] = FriendSetting.fromJson(value);
    });
    json['groupChats'].forEach((key, value) {
      groupChats[key] = GroupChatSetting.fromJson(value);
      groupChatCount += 1;
    });

    // json['groupChats'].forEach((key, value) {
    //   groupChats[key] = GroupChatSetting.fromJson(value);
    //   groupChatCount += 1;
    // });

    friendGroups = List.from(json['friendGroups']);
  }

  Map<String, FriendSetting> filterGroupFriends(String groupName) {
    Map<String, FriendSetting> groupFriends = {};
    friends.forEach((key, value) {
      if (value.friendGroup == groupName) {
        groupFriends[key] = value;
      }
    });
    return groupFriends;
  }

  void addFriend(String friendId, Map friendSetting) {
    friends[friendId] = FriendSetting.fromJson(friendSetting);
    friendCount += 1;
    notifyListeners();
  }

  void changeFriendRemark(String friendId, String remark) {
    friends[friendId]!.friendRemark = remark;
  }

  void changeFriendGroup(String friendId, String group) {
    friends[friendId]!.friendGroup = group;
  }

  void removeFriend(String friendId) {
    friends.remove(friendId);
    friendCount -= 1;
    notifyListeners();
  }

  void addGroupChat(String groupChatId) {
    groupChats[groupChatId] =
        GroupChatSetting.fromJson({'nameRemark': '', 'myRemark': ''});
    groupChatCount += 1;
    notifyListeners();
  }

  void changeGroupChatSetting(
    String setting,
    String groupChatId,
    String newValue,
  ) {
    switch (setting) {
      case 'nameRemark':
        groupChats[groupChatId]!.nameRemark = newValue;
        break;
      case 'myRemark':
        groupChats[groupChatId]!.myRemark = newValue;
        break;
    }

    notifyListeners();
  }

  void deleteGroupChat(String groupChatId) {
    groupChats.remove(groupChatId);
    groupChatCount--;
    notifyListeners();
  }

  void clear() {
    friends.clear();
    friendGroups.clear();
    groupChats.clear();
    defaultGroup = '';
    friendCount = 0;
    groupChatCount = 0;
  }
}

class FriendAccountProfile {
  String id = '';
  String username = '';
  String email = '';
  String nickname = '';
  String gender = '';
  String birthday = '';
  String location = '';
  String status = '';
  String sign = '';
  String avatar = '';
  String baseAvatarPath = '';

  FriendAccountProfile.fromJson(Map<String, dynamic> json) {
    id = json['id'];
    username = json['username'];
    email = json['email'];
    nickname = json['nickname'] ?? '';
    birthday = json['birthday'] ?? '';
    location = json['location'] ?? '';
    status = json['status'] ?? '';
    sign = json['sign'] ?? '';
    avatar = json['avatar'] ?? '';
  }
}

class GroupChatProfile {
  String id = '';
  String name = '';
  String supervisor = '';
  List<String> administrators = [];
  List<String> members = [];
  String introduction = '';
  List noticeboard = [];
  List<String> tags = [];
  String avatar = '';

  GroupChatProfile.fromJson(Map<String, dynamic> json) {
    id = json['id'];
    name = json['name'];
    supervisor = json['supervisor'];
    administrators = List.from(json['administrators']);
    members = List.from(json['members']);
    introduction = json['introduction'] ?? '';
    noticeboard = json['noticeboard'] ?? [];
    tags = List.from(json['tags']);
    avatar = json['avatar'];
  }
}

class GroupChatMemberNameAvatar {
  String remark = '';
  String nickname = '';
  String avatar = '';

  GroupChatMemberNameAvatar.fromJson(Map<String, dynamic> json) {
    remark = json['remark'] ?? '';
    nickname = json['nickname'] ?? '';
    avatar = json['avatar'] ?? '';
  }
}

class ContactAccountProfile extends ChangeNotifier {
  Map<String, FriendAccountProfile> friends = {};
  Map<String, GroupChatProfile> groupChats = {};
  Map<String, Map<String, GroupChatMemberNameAvatar>> grouChatMemberProfiles =
      {};

  void init(Map json) {
    json['friends'].forEach((key, value) {
      friends[key] = FriendAccountProfile.fromJson(value);
    });

    json['groupChats'].forEach((key, value) {
      groupChats[key] = GroupChatProfile.fromJson(value);
    });
  }

  (bool, String) getIdBy(String condition, String filterValue) {
    String friendId = '';
    switch (condition) {
      case 'username':
        for (var key in friends.keys) {
          if (friends[key]!.username == filterValue) {
            friendId = key;
            break;
          }
        }
        break;
    }
    return friendId.isNotEmpty ? (true, friendId) : (false, '');
  }

  void addFriendAccountProfile(String friendId, Map<String, dynamic> json) {
    friends.addAll({friendId: FriendAccountProfile.fromJson(json)});
    notifyListeners();
  }

  void removeFriend(String friendId) {
    friends.remove(friendId);
    notifyListeners();
  }

  void addGroupChatProfile(String groupChatId, Map<String, dynamic> json) {
    groupChats.addAll({groupChatId: GroupChatProfile.fromJson(json)});
    notifyListeners();
  }

  void removeGroupChat(String groupChatId) {
    groupChats.remove(groupChatId);
    notifyListeners();
  }

  void addGroupChatMemberProfile(
    String groupChatId,
    String memberId,
    Map<String, dynamic> json,
  ) {
    if (grouChatMemberProfiles.containsKey(groupChatId)) {
      grouChatMemberProfiles[groupChatId]!.addAll(
        {memberId: GroupChatMemberNameAvatar.fromJson(json)},
      );
    } else {
      grouChatMemberProfiles[groupChatId] = {
        memberId: GroupChatMemberNameAvatar.fromJson(json),
      };
    }
  }

  void refreshGroupChatMemberProfile(
    String groupChatId,
    Map<String, dynamic> json,
  ) {
    json.forEach((key, value) {
      grouChatMemberProfiles[groupChatId]![key] =
          GroupChatMemberNameAvatar.fromJson(value);
    });
  }

  void addGroupChatMembers(String groupChatId, List<String> members) {
    groupChats[groupChatId]!.members.addAll(members);
    notifyListeners();
  }

  void changeGroupChatProfile(
    String profile,
    String groupChatId,
    String newValue,
  ) {
    switch (profile) {
      case 'name':
        groupChats[groupChatId]!.name = newValue;
        break;
      case 'intro':
        groupChats[groupChatId]!.introduction = newValue;
        break;
    }
    notifyListeners();
  }

  void deleteGroupChat(String groupChatId) {
    groupChats.remove(groupChatId);
    grouChatMemberProfiles.remove(groupChatId);
    notifyListeners();
  }

  void clear() {
    friends.clear();
    groupChats.clear();
    grouChatMemberProfiles.clear();
  }
}