import { NextRequest, NextResponse } from 'next/server'
import { getServerSession } from 'next-auth'
import { authOptions } from '@/lib/auth'
import { prisma } from '@/lib/prisma'
import { buscarPublicacoesReais, PublicacaoEncontrada } from '@/lib/diarios-service'

export async function POST(req: NextRequest) {
  const session = await getServerSession(authOptions)
  if (!session?.user?.id) {
    return NextResponse.json({ error: 'Não autorizado' }, { status: 401 })
  }

  const body = await req.json()
  const { processoId, usarMock = false } = body

  // Se processoId fornecido, busca só esse, senão busca todos do usuário
  const processos = processoId
    ? await prisma.processoMonitorado.findMany({
        where: { id: processoId, userId: session.user.id, status: 'ATIVO' },
      })
    : await prisma.processoMonitorado.findMany({
        where: { userId: session.user.id, status: 'ATIVO' },
      })

  if (processos.length === 0) {
    return NextResponse.json({ message: 'Nenhum processo ativo para buscar', found: 0 })
  }

  let totalFound = 0
  const erros: string[] = []

  for (const processo of processos) {
    try {
      // Busca REAL nos diários oficiais (DataJud)
      const resultado = await buscarPublicacoesReais({
        id: processo.id,
        numeroProcesso: processo.numeroProcesso,
        tribunal: processo.tribunal,
      })

      if (!resultado.sucesso) {
        erros.push(`${processo.numeroProcesso}: ${resultado.erro}`)
        continue
      }

      // Insere as publicações encontradas (evitando duplicatas)
      for (const pub of resultado.publicacoes) {
        // Verifica se já existe publicação com mesma data, tipo e fonte
        const existing = await prisma.publicacao.findFirst({
          where: {
            processoId: processo.id,
            dataPublicacao: {
              gte: new Date(pub.dataPublicacao.toDateString()),
              lt: new Date(new Date(pub.dataPublicacao).setDate(pub.dataPublicacao.getDate() + 1)),
            },
            tipo: pub.tipo,
          },
        })

        if (!existing) {
          await prisma.publicacao.create({
            data: {
              processoId: processo.id,
              dataPublicacao: pub.dataPublicacao,
              diario: pub.diario,
              conteudo: pub.conteudo,
              tipo: pub.tipo,
              prazoCalculado: pub.prazoCalculado,
              prazoTipo: pub.prazoTipo,
              visualizado: false,
            },
          })
          totalFound++
        }
      }
    } catch (error) {
      const msg = error instanceof Error ? error.message : 'Erro desconhecido'
      erros.push(`${processo.numeroProcesso}: ${msg}`)
      console.error(`[API] Erro ao buscar ${processo.numeroProcesso}:`, error)
    }
  }

  return NextResponse.json({
    message: totalFound > 0
      ? `Encontradas ${totalFound} nova(s) publicação(ões)`
      : 'Nenhuma nova publicação encontrada',
    found: totalFound,
    processados: processos.length,
    erros: erros.length > 0 ? erros : undefined,
  })
}
