// bot/src/commands/update.ts — Handler do subcomando /bot update <card-id> <texto>
//
// Segurança:
//   S-02: assertOwner obrigatório antes de qualquer mutação
//   S-04: erros são redactSecrets antes de logar/enviar ao Slack

import { cardRepository, AccessDeniedError, CardNotFoundError } from '../db/cardRepository'
import type { WorkTrackerProvider } from '../providers/contracts'
import { redactSecrets } from './bot'

const CARD_ID_REGEX = /^(?:[A-Z][A-Z0-9]+-\d+|GH-\d+|[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+#\d+|https:\/\/github\.com\/[^/\s]+\/[^/\s]+\/issues\/\d+(?:[?#].*)?)$/

export async function handleUpdate(
  args: string,
  command: any,
  respond: any,
  _client: any,
  workTrackerProvider: WorkTrackerProvider,
): Promise<void> {
  const userId: string = command.user_id

  // 1. Parsear args
  const parts = args.trim().split(/\s+/)
  const cardId = parts[0] ?? ''
  const texto = parts.slice(1).join(' ')

  // 2. Validar card_id
  if (!CARD_ID_REGEX.test(cardId) || !workTrackerProvider.isValidCardId(cardId)) {
    await respond({
      text: `❌ ID de card inválido: \`${cardId}\`. Use *PROJ-123* para Jira ou *GH-123* para GitHub.`,
      response_type: 'ephemeral',
    })
    return
  }
  const localCardId = workTrackerProvider.normalizeCardId(cardId)

  // 3. Validar texto não-vazio
  if (!texto.trim()) {
    await respond({
      text: '❌ Texto não pode ser vazio.\nUso: `/bot update <card-id> <novo texto>`',
      response_type: 'ephemeral',
    })
    return
  }

  // 4. S-02: assertOwner OBRIGATÓRIO
  try {
    cardRepository.assertOwner(localCardId, userId)
  } catch (err) {
    if (err instanceof CardNotFoundError) {
      await respond({ text: `❌ Card \`${localCardId}\` não encontrado.`, response_type: 'ephemeral' })
    } else if (err instanceof AccessDeniedError) {
      await respond({ text: `❌ Você não tem permissão para editar o card \`${localCardId}\`.`, response_type: 'ephemeral' })
    } else {
      const msg = redactSecrets(String(err instanceof Error ? err.message : err))
      console.error(`[update] assertOwner error:`, msg)
      await respond({ text: `❌ Erro ao verificar acesso ao card: ${msg}`, response_type: 'ephemeral' })
    }
    return
  }

  // 5. Feedback imediato
  await respond({ text: `⏳ Atualizando card \`${localCardId}\`...`, response_type: 'ephemeral' })

  try {
    // 6. Atualizar descrição no work tracker
    await workTrackerProvider.updateDescription(localCardId, texto)

    // 7. Atualizar texto no banco
    cardRepository.touchUpdate(localCardId, texto)

    // 8. Adicionar comentário /bloqueado (reabre o ciclo de revisão)
    await workTrackerProvider.addComment(localCardId, '/bloqueado')

    // 9. Feedback final
    await respond({ text: `✅ Card \`${localCardId}\` atualizado.`, response_type: 'ephemeral' })
  } catch (err) {
    const msg = redactSecrets(String(err instanceof Error ? err.message : err))
    console.error(`[update] erro ao atualizar card ${localCardId}:`, msg)
    await respond({ text: `❌ Erro ao atualizar card \`${localCardId}\`: ${msg}`, response_type: 'ephemeral' })
  }
}
