import { TEMPLATES } from './ack-templates.mjs';

function pickRandom(arr, randomEnabled) {
  if (!randomEnabled || arr.length === 1) return arr[0];
  return arr[Math.floor(Math.random() * arr.length)];
}

function withNickname(text, nickname, nicknameEnabled) {
  if (!nicknameEnabled || !nickname) return text;
  return `${nickname}，${text}`;
}

function buildText(pool, ctx) {
  const text = pickRandom(pool, ctx.randomEnabled);
  return withNickname(text, ctx.nickname, ctx.nicknameEnabled);
}

const ImageBuilder = {
  priority: 80,
  support: (ctx) => ctx.msgType === 'image',
  build: (ctx) => buildText(TEMPLATES.image, ctx),
};

const VoiceBuilder = {
  priority: 80,
  support: (ctx) => ctx.msgType === 'voice',
  build: (ctx) => buildText(TEMPLATES.voice, ctx),
};

const LocationBuilder = {
  priority: 80,
  support: (ctx) => ctx.msgType === 'location',
  build: (ctx) => buildText(TEMPLATES.location, ctx),
};

const LinkBuilder = {
  priority: 80,
  support: (ctx) => ctx.msgType === 'link',
  build: (ctx) => buildText(TEMPLATES.link, ctx),
};

const IntentBuilder = {
  priority: 50,
  support: (ctx) => {
    const task = ctx.intent?.task;
    return task && task !== 'unknown' && TEMPLATES.intent[task];
  },
  build: (ctx) => buildText(TEMPLATES.intent[ctx.intent.task], ctx),
};

const DefaultBuilder = {
  priority: 0,
  support: () => true,
  build: (ctx) => buildText(TEMPLATES.default, ctx),
};

const BUILDERS = [ImageBuilder, VoiceBuilder, LocationBuilder, LinkBuilder, IntentBuilder, DefaultBuilder]
  .sort((a, b) => b.priority - a.priority);

export function selectBuilder(ctx) {
  return BUILDERS.find((b) => b.support(ctx)) ?? DefaultBuilder;
}
