type SuggestionInput = {
  context: string[]
  question: string
}

function normalize(text: string) {
  return text.replace(/\s+/g, ' ').trim().toLowerCase()
}

function uniqueSuggestions(items: string[]) {
  const seen = new Set<string>()
  const result: string[] = []
  for (const item of items) {
    const key = normalize(item)
    if (!key || seen.has(key)) continue
    seen.add(key)
    result.push(item.trim())
  }
  return result
}

function truncateQuestion(question: string) {
  const trimmed = question.trim()
  if (!trimmed) return '질문'
  const firstSentence = trimmed.split(/[?!.]/)[0] || trimmed
  if (firstSentence.length <= 40) return firstSentence
  return `${firstSentence.slice(0, 40)}…`
}

function buildRuleBasedSuggestions(question: string): string[] {
  const base = truncateQuestion(question)
  return [
    `${base}에 대해 현재 상황을 먼저 요약드리겠습니다.`,
    `${base}의 핵심 포인트는 일정과 비용입니다.`,
    `${base}에 대해서는 리스크와 대안을 비교해보겠습니다.`,
    `${base} 관련해서 우선순위를 정해 제안드릴게요.`,
    `${base}에 대한 다음 액션을 정리해드리겠습니다.`,
  ]
}

async function buildOpenAiSuggestions(input: SuggestionInput): Promise<string[]> {
  const apiKey = process.env.OPENAI_API_KEY
  if (!apiKey) {
    return buildRuleBasedSuggestions(input.question)
  }

  const prompt = [
    '당신은 회의 중 답변 후보를 제안하는 비서입니다.',
    '질문에 대해 5개의 간결한 한국어 답변 후보만 리스트로 만들어 주세요.',
    '각 답변은 한 문장으로 짧게 작성합니다.',
    '',
    `질문: ${input.question}`,
    '',
    '최근 대화 요약:',
    ...input.context.map((line) => `- ${line}`),
  ].join('\n')

  const response = await fetch('https://api.openai.com/v1/chat/completions', {
    method: 'POST',
    headers: {
      Authorization: `Bearer ${apiKey}`,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      model: 'gpt-4o-mini',
      messages: [
        {
          role: 'user',
          content: prompt,
        },
      ],
      temperature: 0.4,
    }),
  })

  if (!response.ok) {
    return buildRuleBasedSuggestions(input.question)
  }

  const data = (await response.json()) as {
    choices?: { message?: { content?: string } }[]
  }
  const content = data.choices?.[0]?.message?.content || ''
  const lines = content
    .split('\n')
    .map((line) => line.replace(/^\s*[\-\d\.\)]\s*/, '').trim())
    .filter(Boolean)
  const suggestions = uniqueSuggestions(lines).slice(0, 5)
  if (suggestions.length >= 5) {
    return suggestions
  }
  const fallback = buildRuleBasedSuggestions(input.question)
  return uniqueSuggestions([...suggestions, ...fallback]).slice(0, 5)
}

export async function generateSuggestions(input: SuggestionInput): Promise<string[]> {
  if (!input.question.trim()) {
    return uniqueSuggestions(buildRuleBasedSuggestions(input.question)).slice(0, 5)
  }
  const suggestions = await buildOpenAiSuggestions(input)
  return uniqueSuggestions(suggestions).slice(0, 5)
}
