import { NextRequest, NextResponse } from 'next/server'
import { query } from '@/lib/db'

export async function GET(
  _req: NextRequest,
  { params }: { params: Promise<{ cnpj: string }> },
) {
  const { cnpj } = await params

  const [lead] = await query(
    `SELECT
       e.*,
       sn.opcao_simples, sn.opcao_mei,
       sn.data_opcao_simples, sn.data_exclusao_simples,
       sn.data_opcao_mei, sn.data_exclusao_mei,
       COALESCE(cl.crm_type, 'lead')  AS crm_type,
       COALESCE(cl.stage,    'novo')  AS stage,
       cl.produto, cl.motivo, cl.notes, cl.cadastrado_em
     FROM empresas_monitoradas e
     LEFT JOIN simples_nacional sn ON sn.cnpj_basico = e.cnpj_basico
     LEFT JOIN crm_leads cl ON cl.cnpj = e.cnpj
     WHERE e.cnpj = $1`,
    [cnpj],
  )

  if (!lead) return NextResponse.json({ error: 'not found' }, { status: 404 })

  const socios = await query(
    `SELECT
       nome_socio, cpf_cnpj_socio,
       qualificacao_socio_codigo, qualificacao_socio_desc,
       representante_legal_cpf, nome_representante,
       qualificacao_representante_codigo, qualificacao_representante_desc,
       data_entrada_sociedade, eh_administrador
     FROM socios_administradores
     WHERE cnpj_empresa = $1
     ORDER BY eh_administrador DESC, nome_socio`,
    [cnpj],
  )

  return NextResponse.json({ lead, socios })
}

export async function PATCH(
  req: NextRequest,
  { params }: { params: Promise<{ cnpj: string }> },
) {
  const { cnpj } = await params
  const body = await req.json() as {
    stage?: string
    crm_type?: string
    produto?: string | null
    motivo?: string | null
    notes?: string | null
  }

  const allowed = ['stage', 'crm_type', 'produto', 'motivo', 'notes'] as const
  const sets: string[] = []
  const vals: unknown[] = []
  let i = 1

  for (const key of allowed) {
    if (key in body) {
      sets.push(`${key} = $${i}`)
      vals.push((body as Record<string, unknown>)[key])
      i++
    }
  }

  if (!sets.length) {
    return NextResponse.json({ error: 'no fields to update' }, { status: 400 })
  }

  vals.push(cnpj)
  const fields = allowed.filter(k => k in body)
  // cnpj vai por último em vals (linha acima) — a lista de colunas precisa
  // seguir a mesma ordem, senão os placeholders $N caem na coluna errada.
  const colList = [...fields, 'cnpj'].join(', ')
  const valPlaceholders = vals.map((_, j) => `$${j + 1}`).join(', ')

  try {
    await query(
      `INSERT INTO crm_leads (${colList})
       VALUES (${valPlaceholders})
       ON CONFLICT (cnpj) DO UPDATE SET
         ${sets.join(', ')},
         atualizado_em = NOW()`,
      vals,
    )
  } catch (err: unknown) {
    const msg = err instanceof Error ? err.message : String(err)
    return NextResponse.json({ error: msg }, { status: 500 })
  }

  return NextResponse.json({ ok: true })
}
