-- name: CreateProfissional :one
INSERT INTO cadastro_profissionais (
    usuario_id, nome, funcao_profissional_id, endereco, cidade, uf, whatsapp,
    cep, numero, complemento, bairro,
    cpf_cnpj_titular, banco, agencia, conta_pix, conta, carro_disponivel,
    tem_estudio, qtd_estudio, tipo_cartao, observacao, qual_tec,
    educacao_simpatia, desempenho_evento, disp_horario, media,
    tabela_free, extra_por_equipamento, equipamentos, email, avatar_url, regiao
) VALUES (
    $1, $2, $3, $4, $5, $6, $7,
    $28, $29, $30, $31,
    $8, $9, $10, $11, $12, $13, $14, $15,
    $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, @regiao
) 
ON CONFLICT (email) DO UPDATE SET
    nome = EXCLUDED.nome,
    funcao_profissional_id = EXCLUDED.funcao_profissional_id,
    whatsapp = EXCLUDED.whatsapp,
    endereco = EXCLUDED.endereco,
    cidade = EXCLUDED.cidade,
    uf = EXCLUDED.uf,
    cep = EXCLUDED.cep,
    numero = EXCLUDED.numero,
    complemento = EXCLUDED.complemento,
    bairro = EXCLUDED.bairro,
    cpf_cnpj_titular = EXCLUDED.cpf_cnpj_titular,
    banco = EXCLUDED.banco,
    agencia = EXCLUDED.agencia,
    conta_pix = EXCLUDED.conta_pix,
    conta = EXCLUDED.conta,
    carro_disponivel = EXCLUDED.carro_disponivel,
    tem_estudio = EXCLUDED.tem_estudio,
    qtd_estudio = EXCLUDED.qtd_estudio,
    tipo_cartao = EXCLUDED.tipo_cartao,
    observacao = EXCLUDED.observacao,
    qual_tec = EXCLUDED.qual_tec,
    educacao_simpatia = EXCLUDED.educacao_simpatia,
    desempenho_evento = EXCLUDED.desempenho_evento,
    disp_horario = EXCLUDED.disp_horario,
    media = EXCLUDED.media,
    tabela_free = EXCLUDED.tabela_free,
    extra_por_equipamento = EXCLUDED.extra_por_equipamento,
    equipamentos = EXCLUDED.equipamentos,
    avatar_url = EXCLUDED.avatar_url,
    regiao = EXCLUDED.regiao,
    atualizado_em = NOW()
RETURNING *;

-- name: GetProfissionalByUsuarioID :one
SELECT p.*, u.email as usuario_email,
    COALESCE(
        (SELECT json_agg(json_build_object('id', f.id, 'nome', f.nome))
         FROM profissionais_funcoes_junction pfj
         JOIN funcoes_profissionais f ON pfj.funcao_id = f.id
         WHERE pfj.profissional_id = p.id
        ), '[]'::json
    ) as functions
FROM cadastro_profissionais p
LEFT JOIN usuarios u ON p.usuario_id = u.id
WHERE p.usuario_id = $1 LIMIT 1;

-- name: GetProfissionalByID :one
SELECT p.*, 
    COALESCE(
        (SELECT json_agg(json_build_object('id', f.id, 'nome', f.nome))
         FROM profissionais_funcoes_junction pfj
         JOIN funcoes_profissionais f ON pfj.funcao_id = f.id
         WHERE pfj.profissional_id = p.id
        ), '[]'::json
    ) as functions
FROM cadastro_profissionais p
WHERE p.id = $1 AND p.regiao = @regiao LIMIT 1;

-- name: ListProfissionais :many
SELECT p.*, u.email as usuario_email,
    COALESCE(
        (SELECT json_agg(json_build_object('id', f.id, 'nome', f.nome))
         FROM profissionais_funcoes_junction pfj
         JOIN funcoes_profissionais f ON pfj.funcao_id = f.id
         WHERE pfj.profissional_id = p.id
        ), '[]'::json
    ) as functions
FROM cadastro_profissionais p
LEFT JOIN usuarios u ON p.usuario_id = u.id
WHERE p.regiao = @regiao
ORDER BY p.nome;

-- name: UpdateProfissional :one
UPDATE cadastro_profissionais
SET
    nome = $2,
    funcao_profissional_id = $3,
    endereco = $4,
    cidade = $5,
    uf = $6,
    whatsapp = $7,
    cep = $28,
    numero = $29,
    complemento = $30,
    bairro = $31,
    cpf_cnpj_titular = $8,
    banco = $9,
    agencia = $10,
    conta_pix = $11,
    conta = $12,
    carro_disponivel = $13,
    tem_estudio = $14,
    qtd_estudio = $15,
    tipo_cartao = $16,
    observacao = $17,
    qual_tec = $18,
    educacao_simpatia = $19,
    desempenho_evento = $20,
    disp_horario = $21,
    media = $22,
    tabela_free = $23,
    extra_por_equipamento = $24,
    equipamentos = $25,
    avatar_url = $26,
    email = $27,
    atualizado_em = NOW()
WHERE id = $1 AND regiao = @regiao
RETURNING *;

-- name: DeleteProfissional :exec
DELETE FROM cadastro_profissionais
WHERE id = $1 AND regiao = @regiao;

-- name: LinkProfissionalToUsuario :exec
UPDATE cadastro_profissionais
SET usuario_id = $2
WHERE id = $1 AND regiao = @regiao;

-- name: SearchProfissionais :many
SELECT p.*, 
    COALESCE(
        (SELECT json_agg(json_build_object('id', f.id, 'nome', f.nome))
         FROM profissionais_funcoes_junction pfj
         JOIN funcoes_profissionais f ON pfj.funcao_id = f.id
         WHERE pfj.profissional_id = p.id
        ), '[]'::json
    ) as functions
FROM cadastro_profissionais p
WHERE p.nome ILIKE '%' || $1 || '%' AND p.regiao = @regiao
ORDER BY p.nome
LIMIT 20;

-- name: SearchProfissionaisByFunction :many
SELECT p.*, 
    COALESCE(
        (SELECT json_agg(json_build_object('id', f2.id, 'nome', f2.nome))
         FROM profissionais_funcoes_junction pfj2
         JOIN funcoes_profissionais f2 ON pfj2.funcao_id = f2.id
         WHERE pfj2.profissional_id = p.id
        ), '[]'::json
    ) as functions
FROM cadastro_profissionais p
WHERE (p.nome ILIKE '%' || $1 || '%') AND p.regiao = @regiao
  AND (
      EXISTS (
        SELECT 1 
        FROM profissionais_funcoes_junction pfj
        JOIN funcoes_profissionais f ON pfj.funcao_id = f.id
        WHERE pfj.profissional_id = p.id AND f.nome = $2
      )
      OR 
      p.funcao_profissional_id = (SELECT id FROM funcoes_profissionais WHERE nome = $2 LIMIT 1)
  )
ORDER BY p.nome
LIMIT 20;

-- name: AddFunctionToProfessional :exec
INSERT INTO profissionais_funcoes_junction (profissional_id, funcao_id)
VALUES ($1, $2)
ON CONFLICT DO NOTHING;

-- name: ClearProfessionalFunctions :exec
DELETE FROM profissionais_funcoes_junction WHERE profissional_id = $1;

-- name: DeleteProfessionalFunctions :exec
DELETE FROM profissionais_funcoes_junction WHERE profissional_id = $1;

-- name: GetProfissionalByCPF :one
SELECT p.*, 
    COALESCE(
        (SELECT json_agg(json_build_object('id', f.id, 'nome', f.nome))
         FROM profissionais_funcoes_junction pfj
         JOIN funcoes_profissionais f ON pfj.funcao_id = f.id
         WHERE pfj.profissional_id = p.id
        ), '[]'::json
    ) as functions
FROM cadastro_profissionais p
WHERE p.cpf_cnpj_titular = $1 AND p.regiao = @regiao LIMIT 1;

-- name: LinkUserToProfessional :exec
UPDATE cadastro_profissionais SET usuario_id = $2 WHERE id = $1;
