import { NextRequest, NextResponse } from 'next/server'
import { getServerSession } from 'next-auth'
import { authOptions } from '@/lib/auth'
import { prisma } from '@/lib/prisma'
import OpenAI from 'openai'

const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY })

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

  const audits = await prisma.contractAudit.findMany({
    where: { userId: session.user.id },
    orderBy: { createdAt: 'desc' },
    select: {
      id: true,
      title: true,
      status: true,
      riskScore: true,
      createdAt: true,
    },
  })

  return NextResponse.json({ audits })
}

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

  // Check credits
  const user = await prisma.user.findUnique({ where: { id: session.user.id } })
  if (!user || user.credits < 3) {
    return NextResponse.json({ error: 'Créditos insuficientes. A auditoria custa 3 créditos.' }, { status: 403 })
  }

  const body = await req.json()
  const { title, content } = body

  if (!title || !content) {
    return NextResponse.json({ error: 'Título e conteúdo são obrigatórios' }, { status: 400 })
  }

  if (title.length > 500) {
    return NextResponse.json({ error: "Título muito longo (máx 500 caracteres)" }, { status: 400 })
  }

  if (content.length > 100000) {
    return NextResponse.json({ error: "Conteúdo muito longo (máx 100.000 caracteres)" }, { status: 400 })
  }

  if (content.length < 100) {
    return NextResponse.json({ error: 'O contrato deve ter pelo menos 100 caracteres' }, { status: 400 })
  }

  // Create audit record
  const audit = await prisma.contractAudit.create({
    data: {
      userId: session.user.id,
      title,
      content,
      status: 'ANALYZING',
    },
  })

  // Deduct credits
  await prisma.user.update({
    where: { id: session.user.id },
    data: { credits: { decrement: 3 } },
  })

  // Call OpenAI for analysis
  try {
    const completion = await openai.chat.completions.create({
      model: 'gpt-4o-mini',
      messages: [
        {
          role: 'system',
          content: `Você é um advogado especialista em análise de contratos brasileiros. Analise o contrato fornecido e retorne APENAS um JSON válido (sem markdown, sem backticks) com a seguinte estrutura:
{
  "riskScore": <número de 0 a 100, onde 100 é risco máximo>,
  "resumo": "<resumo executivo do contrato em 2-3 frases>",
  "clausulasAbusivas": [{"clausula": "<identificação>", "descricao": "<problema>", "gravidade": "alta|media|baixa"}],
  "inconsistencias": [{"item": "<identificação>", "descricao": "<problema>"}],
  "lacunas": [{"item": "<o que falta>", "descricao": "<por que é importante>"}],
  "riscos": [{"risco": "<identificação>", "descricao": "<detalhes>", "gravidade": "alta|media|baixa"}],
  "sugestoes": [{"sugestao": "<título>", "descricao": "<como implementar>"}],
  "pontosFavoraveis": [{"ponto": "<identificação>", "descricao": "<detalhes>"}]
}`
        },
        {
          role: 'user',
          content: `Analise o seguinte contrato:\n\n${content.substring(0, 15000)}`
        }
      ],
      temperature: 0.3,
      max_tokens: 4000,
    })

    const responseText = completion.choices[0]?.message?.content || '{}'
    let analysis
    try {
      analysis = JSON.parse(responseText)
    } catch {
      // Try to extract JSON from response
      const jsonMatch = responseText.match(/\{[\s\S]*\}/)
      analysis = jsonMatch ? JSON.parse(jsonMatch[0]) : { error: 'Falha ao parsear análise', raw: responseText }
    }

    const riskScore = typeof analysis.riskScore === 'number' ? Math.min(100, Math.max(0, analysis.riskScore)) : 50

    await prisma.contractAudit.update({
      where: { id: audit.id },
      data: {
        analysis,
        riskScore,
        status: 'DONE',
      },
    })

    return NextResponse.json({
      audit: { ...audit, analysis, riskScore, status: 'DONE' },
    })
  } catch (error) {
    console.error('OpenAI error:', error)
    await prisma.contractAudit.update({
      where: { id: audit.id },
      data: { status: 'ERROR' },
    })

    // Refund credits on error
    await prisma.user.update({
      where: { id: session.user.id },
      data: { credits: { increment: 3 } },
    })

    return NextResponse.json({ error: 'Erro ao analisar contrato' }, { status: 500 })
  }
}
