import { NextRequest, NextResponse } from 'next/server'
import pool from '@/lib/db'
import { getSessionFromRequest } from '@/lib/session'

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

  const tenantId = req.nextUrl.searchParams.get('tenant_id')
  const ouFilter = req.nextUrl.searchParams.get('ou') ?? ''
  const queryParams: any[] = []
  let where = 'WHERE 1=1'

  if (user.role !== 'admin_global') {
    where += ' AND g.tenant_id = ?'
    queryParams.push((user as any).tenant_id ?? (user as any).tenantId)
  } else if (tenantId) {
    where += ' AND g.tenant_id = ?'
    queryParams.push(tenantId)
  }

  if (ouFilter) {
    // Filtra pela OU extraída do DN do grupo (tudo após o primeiro componente CN=...)
    where += ' AND SUBSTRING(g.dn, LOCATE(\',\', g.dn) + 1) = ?'
    queryParams.push(ouFilter)
  }

  const [rows] = await pool.execute<any[]>(
    `SELECT g.*,
       (SELECT COUNT(*) FROM ad_group_members gm WHERE gm.group_id = g.id) as member_count
     FROM ad_groups g ${where}
     ORDER BY g.display_name ASC`,
    queryParams
  )
  return NextResponse.json(rows)
}

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

  const body = await req.json()
  const { tenant_id, sam_account_name, display_name, description, dn } = body

  const targetTenant = user.role === 'admin_global' ? tenant_id : ((user as any).tenantId ?? (user as any).tenant_id)

  const [result] = await pool.execute<any>(
    `INSERT INTO ad_groups (tenant_id, sam_account_name, display_name, description, dn)
     VALUES (?, ?, ?, ?, ?)`,
    [targetTenant, sam_account_name, display_name ?? sam_account_name, description ?? null, dn ?? '']
  )

  await pool.execute(
    `INSERT INTO agent_tasks (tenant_id, type, payload, status) VALUES (?, 'create_group', ?, 'pending')`,
    [targetTenant, JSON.stringify({ group_id: result.insertId, ...body })]
  )

  const [rows] = await pool.execute<any[]>('SELECT * FROM ad_groups WHERE id = ?', [result.insertId])
  return NextResponse.json(rows[0], { status: 201 })
}
