-- name: CreateUsuario :one
INSERT INTO usuarios (email, senha_hash, role, tipo_profissional, ativo)
VALUES ($1, $2, $3, $4, $5)
RETURNING *;

-- name: GetUsuarioByEmail :one
SELECT u.id, u.email, u.senha_hash, u.role, u.tipo_profissional, u.ativo, u.criado_em, u.atualizado_em, u.regioes_permitidas,
       COALESCE(cp.nome, cc.nome, '') as nome,
       COALESCE(cp.whatsapp, cc.telefone, '') as whatsapp,
       e.id as empresa_id,
       e.nome as empresa_nome
FROM usuarios u
LEFT JOIN cadastro_profissionais cp ON u.id = cp.usuario_id
LEFT JOIN cadastro_clientes cc ON u.id = cc.usuario_id
LEFT JOIN empresas e ON cc.empresa_id = e.id
WHERE u.email = $1 LIMIT 1;

-- name: GetUsuarioByID :one
SELECT u.id, u.email, u.senha_hash, u.role, u.tipo_profissional, u.ativo, u.criado_em, u.atualizado_em, u.regioes_permitidas,
       COALESCE(cp.nome, cc.nome, '') as nome,
       COALESCE(cp.whatsapp, cc.telefone, '') as whatsapp,
       e.id as empresa_id,
       e.nome as empresa_nome
FROM usuarios u
LEFT JOIN cadastro_profissionais cp ON u.id = cp.usuario_id
LEFT JOIN cadastro_clientes cc ON u.id = cc.usuario_id
LEFT JOIN empresas e ON cc.empresa_id = e.id
WHERE u.id = $1 LIMIT 1;

-- name: DeleteUsuario :exec
DELETE FROM usuarios
WHERE id = $1;

-- name: ListUsuariosPending :many
SELECT u.id, u.email, u.role, u.tipo_profissional, u.ativo, u.criado_em, u.regioes_permitidas,
       COALESCE(cp.nome, cc.nome, '') as nome,
       COALESCE(cp.whatsapp, cc.telefone, '') as whatsapp,
       e.id as empresa_id,
       e.nome as empresa_nome
FROM usuarios u
LEFT JOIN cadastro_profissionais cp ON u.id = cp.usuario_id
LEFT JOIN cadastro_clientes cc ON u.id = cc.usuario_id
LEFT JOIN empresas e ON cc.empresa_id = e.id
WHERE u.ativo = false
  AND $1::text = ANY(u.regioes_permitidas)
ORDER BY u.criado_em DESC;

-- name: UpdateUsuarioAtivo :one
UPDATE usuarios
SET ativo = $2, atualizado_em = NOW()
WHERE id = $1
RETURNING *;

-- name: UpdateUsuarioRole :one
UPDATE usuarios
SET role = $2, atualizado_em = NOW()
WHERE id = $1
RETURNING *;

-- name: UpdateUsuarioRegions :exec
UPDATE usuarios
SET regioes_permitidas = $2, atualizado_em = NOW()
WHERE id = $1;

-- name: UpdateUsuarioSenha :exec
UPDATE usuarios
SET senha_hash = $2, atualizado_em = NOW()
WHERE id = $1;

-- name: ListAllUsuarios :many
SELECT u.id, u.email, u.role, u.tipo_profissional, u.ativo, u.criado_em, u.atualizado_em, u.regioes_permitidas,
       COALESCE(cp.nome, cc.nome, '') as nome,
       COALESCE(cp.whatsapp, cc.telefone, '') as whatsapp,
       e.id as empresa_id,
       e.nome as empresa_nome
FROM usuarios u
LEFT JOIN cadastro_profissionais cp ON u.id = cp.usuario_id
LEFT JOIN cadastro_clientes cc ON u.id = cc.usuario_id
LEFT JOIN empresas e ON cc.empresa_id = e.id
WHERE $1::text = ANY(u.regioes_permitidas)
ORDER BY u.criado_em DESC;

-- name: CreateCadastroCliente :one
INSERT INTO cadastro_clientes (
    usuario_id, 
    empresa_id, 
    nome, 
    telefone,
    cpf_cnpj,
    cep,
    endereco,
    numero,
    complemento,
    bairro,
    cidade,
    estado
)
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)
RETURNING *;

-- name: UpdateCadastroCliente :one
UPDATE cadastro_clientes
SET 
    nome = COALESCE($2, nome),
    telefone = COALESCE($3, telefone),
    cpf_cnpj = COALESCE($4, cpf_cnpj),
    cep = COALESCE($5, cep),
    endereco = COALESCE($6, endereco),
    numero = COALESCE($7, numero),
    complemento = COALESCE($8, complemento),
    bairro = COALESCE($9, bairro),
    cidade = COALESCE($10, cidade),
    estado = COALESCE($11, estado),
    atualizado_em = NOW()
WHERE usuario_id = $1
RETURNING *;

-- name: GetCadastroClienteByUsuarioID :one
SELECT * FROM cadastro_clientes
WHERE usuario_id = $1 LIMIT 1;
