/**
 * Username Generator - 用户名生成器
 */

const { randomInt } = require('../../utils');

class UsernameGenerator {
  constructor() {
    this.adjectives = [
      'quick', 'bright', 'swift', 'clever', 'smart',
      'cool', 'happy', 'lucky', 'brave', 'wise',
      'silent', 'dark', 'golden', 'silver', 'mystic'
    ];

    this.nouns = [
      'wolf', 'fox', 'eagle', 'tiger', 'dragon',
      'phoenix', 'lion', 'bear', 'falcon', 'hawk',
      'ninja', 'wizard', 'warrior', 'knight', 'hunter'
    ];
  }

  /**
   * 生成用户名
   * @param {Object} options - 选项
   * @returns {string}
   */
  generate(options = {}) {
    const { pattern, minLength, maxLength } = options;

    if (pattern) {
      return this.generateFromPattern(pattern);
    }

    // 默认生成策略
    const type = options.type || 'random';
    
    switch (type) {
      case 'word':
        return this.generateWordBased();
      case 'random':
        return this.generateRandom(minLength, maxLength);
      case 'numeric':
        return this.generateNumeric();
      default:
        return this.generateWordBased();
    }
  }

  /**
   * 基于模式生成
   * @param {string} pattern - 模式，如 "user_{random}", "player_{number}"
   * @returns {string}
   */
  generateFromPattern(pattern) {
    return pattern
      .replace('{random}', Math.random().toString(36).substring(2, 10))
      .replace('{number}', randomInt(1000, 9999).toString())
      .replace('{timestamp}', Date.now().toString().slice(-8));
  }

  /**
   * 生成基于单词的用户名
   * @returns {string}
   */
  generateWordBased() {
    const adj = this.adjectives[randomInt(0, this.adjectives.length - 1)];
    const noun = this.nouns[randomInt(0, this.nouns.length - 1)];
    const number = randomInt(10, 999);
    
    return `${adj}${noun}${number}`;
  }

  /**
   * 生成随机字符串用户名
   * @param {number} minLength - 最小长度
   * @param {number} maxLength - 最大长度
   * @returns {string}
   */
  generateRandom(minLength = 8, maxLength = 12) {
    const length = randomInt(minLength, maxLength);
    let username = '';
    const chars = 'abcdefghijklmnopqrstuvwxyz0123456789';
    
    // 首字母必须是字母
    username += chars.charAt(randomInt(0, 25));
    
    // 其余字符
    for (let i = 1; i < length; i++) {
      username += chars.charAt(randomInt(0, chars.length - 1));
    }
    
    return username;
  }

  /**
   * 生成数字用户名
   * @returns {string}
   */
  generateNumeric() {
    return `user${randomInt(100000, 999999)}`;
  }

  /**
   * 批量生成
   * @param {number} count - 数量
   * @param {Object} options - 选项
   * @returns {Array}
   */
  generateBatch(count, options = {}) {
    const usernames = [];
    for (let i = 0; i < count; i++) {
      usernames.push(this.generate(options));
    }
    return usernames;
  }
}

module.exports = UsernameGenerator;
