'use strict';

/**
 * input-prompt.js
 * ─────────────────────────────────────────────────────
 * 通用「参数填写」交互模块
 *
 * 用于 input 类型的步骤：执行命令前需要用户填写动态参数。
 * 暂时退出 raw mode → 用 readline 逐个收集参数 → 恢复 raw mode。
 *
 * 可复用于任何需要在 TUI 会话中收集用户输入的场景。
 */

const readline = require('readline');
const chalk    = require('chalk');
const { hr, W } = require('./render');

/**
 * 收集一组用户输入参数
 *
 * @param {Array<InputDef>} inputs
 *   InputDef: { key, label, hint?, placeholder? }
 * @returns {Promise<Object>} - { [key]: value }
 */
async function collectInputs(inputs) {
  // 退出 raw mode，使 readline 能正常接收输入
  process.stdin.setRawMode(false);

  const values = {};

  for (const input of inputs) {
    values[input.key] = await _ask(input);
  }

  // 恢复 raw mode
  // readline.close() 内部会 pause stdin，必须显式 resume 否则后续监听失效
  process.stdin.setRawMode(true);
  process.stdin.resume();

  return values;
}

/**
 * 显示单个参数的输入提示并等待用户输入
 */
function _ask(input) {
  return new Promise(resolve => {
    const rl = readline.createInterface({
      input:    process.stdin,
      output:   process.stdout,
      terminal: true,
    });

    // Ctrl+C 优雅处理：恢复 raw mode 后退出
    rl.on('SIGINT', () => {
      rl.close();
      // 恢复 raw mode，然后退出程序
      try { process.stdin.setRawMode(true); } catch (_) {}
      console.log('');
      console.log('  ' + chalk.cyan('已取消。再见！👋'));
      console.log('');
      process.exit(0);
    });

    // 显示 hint
    if (input.hint) {
      console.log('  ' + chalk.dim('💡 ' + input.hint));
    }
    if (input.placeholder) {
      console.log('  ' + chalk.dim('   例如：' + input.placeholder));
    }

    rl.question(
      '  ' + chalk.bold.white(input.label) + chalk.dim('：'),
      answer => {
        rl.close();
        resolve(answer.trim() || '');
      }
    );
  });
}

/**
 * 用参数值替换命令模板中的 {{key}} 占位符
 *
 * @param {string} template - 含 {{key}} 的模板字符串
 * @param {Object} values   - { key: value }
 * @returns {string}
 */
function fillTemplate(template, values) {
  return template.replace(/\{\{(\w+)\}\}/g, (_, key) => {
    return values[key] !== undefined ? values[key] : `<${key}>`;
  });
}

module.exports = { collectInputs, fillTemplate };
