export const makePassword = (): string => {
  // パスワードの文字数を決定
  const passLength = 8;

  // パスワードに使用可能な文字を決定（今回はアルファベットの大文字と小文字 ＋ 数字 ＋ symbolsの記号）
  const lowerCase = 'abcdefghijklmnopqrstuvwxyz';
  const upperCase = lowerCase.toLocaleUpperCase();
  const numbers = '0123456789';
  const symbols = '@#$%^&*\\-_+=[]{}|:\',.?/`~"();!';
  const chars = lowerCase + upperCase + numbers + symbols;

  // 英字の大文字、英字の小文字、アラビア数字、記号（@#$%^&*\-_+=[]{}|\:',.?/`~"();!）から2種類以上組み合わせ
  const charaTypePattern =
    /^((?=.*[a-z])(?=.*[A-Z])|(?=.*[a-z])(?=.*[\d])|(?=.*[a-z])(?=.*[@#$%^&*\\\-_+=\[\]{}|:',.?\/`~"();!])|(?=.*[A-Z])(?=.*[\d])|(?=.*[A-Z])(?=.*[@#$%^&*\\\-_+=\[\]{}|:',.?\/`~"();!])|(?=.*[\d])(?=.*[@#$%^&*\\\-_+=\[\]{}|:',.?\/`~"();!]))[a-zA-Z\d@#$%^&*\\\-_+=\[\]{}|:',.?\/`~"();!]/;

  // autoGeneratedPasswordが以上の条件を満たせばvalidがtrueになる
  let valid = false;
  let autoGeneratedPassword: string;

  while (!valid) {
    autoGeneratedPassword = '';
    // パスワードをランダムに決定
    while (autoGeneratedPassword.length < passLength) {
      // 上で決定したcharsの中からランダムに1文字ずつ追加
      const index = Math.floor(Math.random() * chars.length);
      autoGeneratedPassword += chars[index];
    }

    // パスワードが上で決定した条件をすべて満たしているかチェック
    // 条件を満たすまでループ
    valid =
      autoGeneratedPassword.length == passLength &&
      charaTypePattern.test(autoGeneratedPassword);
  }
  return autoGeneratedPassword;
};
