text: 'use strict';
  
  const fs = require('fs').promises;
  
  class UserStorage {
    // 프라이빗한 변수나 메서드는 최상단으로 위치해야한다.
    static #getUserInfo(data, id) {
      const users = JSON.parse(data);
      const idx = users.id.indexOf(id);
      const usersKeys = Object.keys(users); // -> [id,psword,name]
      const userInfo = usersKeys.reduce((newUser, info) => {
        newUser[info] = users[info][idx];
        return newUser;
      }, {});
  
      return userInfo;
    }
  
    static #getUsers(data, isAll, fields) {
      const users = JSON.parse(data);
      if (isAll) return users;
  
      const newUsers = fields.reduce((newUsers, field) => {
        if (users.hasOwnProperty(field)) {
          newUsers[field] = users[field];
        }
        return newUsers;
      }, {});
      return newUsers;
    }
  
    static getUsers(isAll, ...fields) {
      return fs
        .readFile('./src/databases/users.json')
        .then((data) => {
          return this.#getUsers(data, isAll, fields);
        })
        .catch(console.error);
    }
  
    static getUserInfo(id) {
      return fs
        .readFile('./src/databases/users.json')
        .then((data) => {
          return this.#getUserInfo(data, id);
        })
        .catch(console.error);
    }
  
    static async save(userInfo) {
      const users = await this.getUsers(true);
      if (users.id.includes(userInfo.id)) {
        throw '이미 존재하는 아이디 입니다.';
      }
      users.id.push(userInfo.id);
      users.name.push(userInfo.name);
      users.psword.push(userInfo.psword);
      fs.writeFile('./src/databases/users.json', JSON.stringify(users)); // 저장할 파일 경로, 저장할 데이터 입력
      return { success: true };
    }
  }
  
  module.exports = UserStorage;
  