import { NextRequest, NextResponse } from 'next/server'
import { query } from '@/lib/db'

export async function GET(req: NextRequest) {
  const sp = req.nextUrl.searchParams
  const search   = sp.get('q')    ?? ''
  const sort     = sp.get('sort') ?? 'nome'   // 'nome' | 'recente' | 'antigo'
  const page     = Math.max(1, parseInt(sp.get('page') ?? '1'))
  const pageSize = 50

  const conditions: string[] = []
  const params: unknown[] = []
  let p = 1

  if (search) {
    conditions.push(`(
      sa.nome_socio ILIKE $${p} OR
      sa.cpf_cnpj_socio ILIKE $${p} OR
      e.razao_social ILIKE $${p} OR
      e.municipio ILIKE $${p}
    )`)
    params.push(`%${search}%`); p++
  }

  const where  = conditions.length ? `WHERE ${conditions.join(' AND ')}` : ''
  const offset = (page - 1) * pageSize

  const sortClause = sort === 'recente'
    ? 'data_max DESC NULLS LAST, nome_socio ASC NULLS LAST'
    : sort === 'antigo'
      ? 'data_max ASC NULLS LAST, nome_socio ASC NULLS LAST'
      : 'nome_socio ASC NULLS LAST'

  // Conta contatos únicos (por cpf_cnpj_socio)
  const [{ count }] = await query<{ count: string }>(
    `SELECT COUNT(DISTINCT sa.cpf_cnpj_socio) AS count
     FROM socios_administradores sa
     JOIN empresas_monitoradas e ON e.cnpj = sa.cnpj_empresa
     ${where}`,
    params,
  )

  // Subquery para DISTINCT ON desacoplado da ordenação final
  const rows = await query(
    `SELECT cpf_cnpj_socio, nome_socio, qualificacao_socio_desc,
            nome_representante, eh_administrador, empresa_count
     FROM (
       SELECT DISTINCT ON (sa.cpf_cnpj_socio)
         sa.cpf_cnpj_socio,
         sa.nome_socio,
         sa.qualificacao_socio_desc,
         sa.nome_representante,
         sa.eh_administrador,
         COUNT(*) OVER (PARTITION BY sa.cpf_cnpj_socio) AS empresa_count,
         MAX(sa.data_entrada_sociedade) OVER (PARTITION BY sa.cpf_cnpj_socio) AS data_max
       FROM socios_administradores sa
       JOIN empresas_monitoradas e ON e.cnpj = sa.cnpj_empresa
       ${where}
       ORDER BY sa.cpf_cnpj_socio, sa.nome_socio ASC NULLS LAST
     ) sub
     ORDER BY ${sortClause}
     LIMIT ${pageSize} OFFSET ${offset}`,
    params,
  )

  return NextResponse.json({ rows, total: parseInt(count), page, pageSize })
}
