/**
 * トリガーはこのファイルの中の処理しか設定しない。処理の概要を記載するようにする。
 */

// この処理を各ユーザーに実行してもらう。なお、実行の前にユーザーのトークンをシートに記載してもらう。
function refreshRoomMySheet() {
  // シート「room」からルームIDのリストを取得
  const sheetRoomIdList = getRoomListFromSheet().map(room => room.getId());

  // メンバーのインスタンスを作成して、トークンをメンバーに設定
  const member = new Member();
  member.setTokenFromSheet();

  // そのメンバーが加入しているroomリストを取得して、グループチャット及び↑で取得しているルームIDにないルームのみに絞る
  const roomList = member.getJoinRoomList().filter(room => {
    return room.isSameType(ROOM.type.group)
      && !sheetRoomIdList.includes(room.getId());
  });

  // roomリストをシート「作業」に記載
  BaseLibrary.refreshSheet(
    SHEET.roomMy.name,
    roomList.map(room => room.getOutListRoomMySheet())
  );
}

// これも各自に実行してもらう。それぞれのroomに管理者をinviteする
function inviteAdmin() {

  // 管理者のメンバーのインスタンス
  const adminMember = new Member(MEMBER.type.admin);

  const member = new Member();
  member.setTokenFromSheet();

  // シート「作業」のroomリストから、各自のユーザーが管理権限を持っているもの(そうでないとinviteできないため)を100件抽出して、管理者メンバーをinvite
  getRoomListFromRoomMySheet()
    .filter(room => room.isSameMyRole(ROOM.myRole.admin))
    .slice(0, 100)
    .forEach(room => room.addMember(member.getToken(), adminMember));

  // シート「room」「作業」を更新する
  refreshRoomSheet();
  refreshRoomMySheet();
}

// シート「room」を更新
function refreshRoomSheet() {
  const adminMember = new Member(MEMBER.type.admin);

  // 管理者メンバーが加入しているroomリストを取得して1件ずつ実行
  const outList = adminMember.getJoinRoomList().reduce((roomList, room) => {

    // DMなどは除外
    if (!room.isSameType(ROOM.type.group)) return roomList;

    // シート「room」から取得したroomリストにあるか確認
    const r = roomList.find(r => r.isSame(room));
    if (r === undefined) {
      // なければroomリストに追加
      roomList.push(room);
    } else {
      // あればそのroomでの権限を更新
      r.setRole(room.getRole());
    }
    return roomList;
  }, getRoomListFromSheet()).map(room => room.getOutList());

  BaseLibrary.refreshSheet(
    SHEET.room.name,
    outList
  );
}

// 管理者手順1 シート「file」に追記していく
function addFileSheet() {

  const adminMember = new Member(MEMBER.type.admin);

  // シート「room」から対象のステータスのものを100件抽出
  const roomList = getRoomListFromSheet()
    .filter(room => room.isSameStatus(ROOM.status.phase1))
    .slice(0, 100);

  roomList.forEach(room => {
    let status = ROOM.status.phase2;
    try {
      // シート「file」にそのroomにアップロードされたファイルを追記
      room.addSheetFileList(adminMember.getToken());
    } catch (e) {
      status = e;
    }
    // シート「room」の該当roomのステータスを更新
    room.setSheetStatus(status);
    Utilities.sleep(1000);
  });
}

// 管理者手順2 シート「file」のファイルをgoogleDriveに保存
function saveGoogleDrive() {

  const adminMember = new Member(MEMBER.type.admin);

  // シート「file」のfileリストから、該当ステータスのものを100件抽出
  const fileList = getFileListFromSheet()
    .filter(file => file.isSameStatus(FILE.status.unsaved))
    .slice(0, 100);

  fileList.forEach(file => {
    // fileをgoogleDriveに保存していく。
    file.saveGoogleDrive(adminMember.getToken());
    Utilities.sleep(1000);
  });
}