/**
 * `Command` 사용 예시 (참고용).
 *
 * 이 파일은 `handlers/CommandLoader`가 읽는 `src/commands/` 밖에 있어서
 * 디스코드에 자동 등록되지 않습니다. 실제 명령으로 쓰려면 이 내용을
 * `src/commands/your-command.ts`로 옮기고 `setName`을 고유 이름으로 바꾸세요.
 *
 * 특성은 {@link CommandTrait.Music}이라 `guild_payment.music === true`일 때만
 * 본 처리까지 진행됩니다(미결제 시 「결제가 되지않았습니다」).
 */

import {
  SlashCommandBuilder,
  ChatInputCommandInteraction,
  SlashCommandStringOption,
} from 'discord.js';
import { Command, CommandTrait } from './command';
import { SupportedLocale } from '../i18n';

class ExampleSlashCommand extends Command {
  /** 음악 유료 특성 — DB `guild_payment.music` 플래그를 검사합니다. */
  protected readonly trait = CommandTrait.Music;

  /** 길드에서만 쓰도록 기본 가드 사용 */
  protected guildOnly = true;

  protected define() {
    return (
      new SlashCommandBuilder()
        .setName('command_usage_demo')
        .setDescription('Example: Command base class usage (not registered from this path).')
        .setDescriptionLocalizations({
          ko: '예시: Command 베이스 클래스 사용법 (이 경로에서는 등록되지 않음).',
        })
        // 서브커맨드/옵션은 기존과 같이 붙이면 됩니다.
        .addStringOption((option: SlashCommandStringOption) =>
          option
            .setName('message')
            .setDescription('Echo text')
            .setRequired(false),
        )
    );
  }

  /**
   * 공통 선행 검사가 필요하면 `beforeHandle`을 오버라이드합니다.
   * `false`를 반환하면 이미 응답을 보낸 뒤이므로 `handle`은 실행되지 않습니다.
   */
  protected async beforeHandle(
    interaction: ChatInputCommandInteraction,
    _locale: SupportedLocale,
  ): Promise<boolean> {
    const msg = interaction.options.getString('message');
    if (msg === 'block') {
      await interaction.reply({ content: 'Blocked by beforeHandle.', ephemeral: true });
      return false;
    }
    return true;
  }

  protected async handle(
    interaction: ChatInputCommandInteraction,
    locale: SupportedLocale,
  ): Promise<void> {
    const message = interaction.options.getString('message');
    const guildName = interaction.guild?.name ?? 'unknown';
    const line =
      message != null && message.length > 0
        ? `[${locale}] **${guildName}** — ${message}`
        : `[${locale}] **${guildName}** — (no message option)`;

    await interaction.reply({ content: line, ephemeral: true });
  }
}

/**
 * `commands/*.ts`에서 쓰는 것과 동일한 내보내기 형태:
 *
 * ```ts
 * export default new ExampleSlashCommand().toModule();
 * ```
 */
export default new ExampleSlashCommand().toModule();
