import { randomUUID } from "node:crypto";
import { NextResponse } from "next/server";
import { getDbPool } from "@/db";
import { getSession, hashPassword } from "@/lib/auth";
import { ensureCapitalTenant } from "@/lib/tenant";
export const runtime="nodejs";
const roles=["capital_admin","capital_operator","analyst","client_admin","client_manager","integration_user"];
export async function GET(req:Request){const s=await getSession();if(!s||s.role!=="capital_admin")return NextResponse.json({error:"Sem permissão."},{status:403});const db=getDbPool(),tenantId=new URL(req.url).searchParams.get("tenantId");const[rows]=tenantId?await db.execute("SELECT u.id,u.name,u.email,u.role,u.status,t.name AS tenant_name,u.tenant_id FROM users u LEFT JOIN tenants t ON t.id=u.tenant_id WHERE u.tenant_id=? ORDER BY u.created_at DESC",[tenantId]):await db.execute("SELECT u.id,u.name,u.email,u.role,u.status,t.name AS tenant_name,u.tenant_id FROM users u LEFT JOIN tenants t ON t.id=u.tenant_id ORDER BY u.created_at DESC");const[tenants]=await db.execute("SELECT id,name,slug FROM tenants WHERE status='active' ORDER BY name");return NextResponse.json({users:rows,tenants})}
export async function POST(req:Request){const s=await getSession();if(!s||s.role!=="capital_admin")return NextResponse.json({error:"Sem permissão."},{status:403});const b=await req.json(),email=String(b.email||"").trim().toLowerCase(),name=String(b.name||"").trim(),password=String(b.password||""),role=String(b.role||""),tenantId=String(b.tenantId||"");if(!name||!email||password.length<8||!roles.includes(role))return NextResponse.json({error:"Informe nome, e-mail, perfil e uma senha com ao menos 8 caracteres."},{status:400});const isClient=role.startsWith("client_");if(isClient&&!tenantId)return NextResponse.json({error:"Selecione a empresa à qual este usuário pertence."},{status:400});try{const tenant=tenantId||await ensureCapitalTenant();await getDbPool().execute("INSERT INTO users (id,tenant_id,name,email,password_hash,role) VALUES (?,?,?,?,?,?)",[randomUUID(),tenant,name,email,hashPassword(password),role]);return NextResponse.json({message:"Usuário criado."},{status:201})}catch(e:unknown){const code=typeof e==="object"&&e&&"code"in e?String(e.code):"";return NextResponse.json({error:code==="ER_DUP_ENTRY"?"Já existe um usuário com este e-mail.":"Não foi possível criar o usuário."},{status:400})}}
export async function PATCH(req:Request){const s=await getSession();if(!s||s.role!=="capital_admin")return NextResponse.json({error:"Sem permissão."},{status:403});const b=await req.json(),id=String(b.id||""),password=String(b.password||"");if(!id||password.length<8)return NextResponse.json({error:"Informe uma nova senha com ao menos 8 caracteres."},{status:400});const[r]=await getDbPool().execute("UPDATE users SET password_hash=? WHERE id=?",[hashPassword(password),id]);if(!(r as {affectedRows?:number}).affectedRows)return NextResponse.json({error:"Usuário não encontrado."},{status:404});return NextResponse.json({message:"Senha redefinida."})}
