// Code generated by sqlc. DO NOT EDIT.
// versions:
//   sqlc v1.30.0
// source: profissionais.sql

package generated

import (
	"context"

	"github.com/jackc/pgx/v5/pgtype"
)

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

type AddFunctionToProfessionalParams struct {
	ProfissionalID pgtype.UUID `json:"profissional_id"`
	FuncaoID       pgtype.UUID `json:"funcao_id"`
}

func (q *Queries) AddFunctionToProfessional(ctx context.Context, arg AddFunctionToProfessionalParams) error {
	_, err := q.db.Exec(ctx, addFunctionToProfessional, arg.ProfissionalID, arg.FuncaoID)
	return err
}

const clearProfessionalFunctions = `-- name: ClearProfessionalFunctions :exec
DELETE FROM profissionais_funcoes_junction WHERE profissional_id = $1
`

func (q *Queries) ClearProfessionalFunctions(ctx context.Context, profissionalID pgtype.UUID) error {
	_, err := q.db.Exec(ctx, clearProfessionalFunctions, profissionalID)
	return err
}

const createProfissional = `-- name: CreateProfissional :one
INSERT INTO cadastro_profissionais (
    usuario_id, nome, funcao_profissional_id, endereco, cidade, uf, whatsapp,
    cpf_cnpj_titular, banco, agencia, conta_pix, 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
) VALUES (
    $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15,
    $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26
) RETURNING id, usuario_id, nome, funcao_profissional_id, endereco, cidade, uf, whatsapp, cpf_cnpj_titular, banco, agencia, conta_pix, 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, criado_em, atualizado_em
`

type CreateProfissionalParams struct {
	UsuarioID            pgtype.UUID    `json:"usuario_id"`
	Nome                 string         `json:"nome"`
	FuncaoProfissionalID pgtype.UUID    `json:"funcao_profissional_id"`
	Endereco             pgtype.Text    `json:"endereco"`
	Cidade               pgtype.Text    `json:"cidade"`
	Uf                   pgtype.Text    `json:"uf"`
	Whatsapp             pgtype.Text    `json:"whatsapp"`
	CpfCnpjTitular       pgtype.Text    `json:"cpf_cnpj_titular"`
	Banco                pgtype.Text    `json:"banco"`
	Agencia              pgtype.Text    `json:"agencia"`
	ContaPix             pgtype.Text    `json:"conta_pix"`
	CarroDisponivel      pgtype.Bool    `json:"carro_disponivel"`
	TemEstudio           pgtype.Bool    `json:"tem_estudio"`
	QtdEstudio           pgtype.Int4    `json:"qtd_estudio"`
	TipoCartao           pgtype.Text    `json:"tipo_cartao"`
	Observacao           pgtype.Text    `json:"observacao"`
	QualTec              pgtype.Int4    `json:"qual_tec"`
	EducacaoSimpatia     pgtype.Int4    `json:"educacao_simpatia"`
	DesempenhoEvento     pgtype.Int4    `json:"desempenho_evento"`
	DispHorario          pgtype.Int4    `json:"disp_horario"`
	Media                pgtype.Numeric `json:"media"`
	TabelaFree           pgtype.Text    `json:"tabela_free"`
	ExtraPorEquipamento  pgtype.Bool    `json:"extra_por_equipamento"`
	Equipamentos         pgtype.Text    `json:"equipamentos"`
	Email                pgtype.Text    `json:"email"`
	AvatarUrl            pgtype.Text    `json:"avatar_url"`
}

func (q *Queries) CreateProfissional(ctx context.Context, arg CreateProfissionalParams) (CadastroProfissionai, error) {
	row := q.db.QueryRow(ctx, createProfissional,
		arg.UsuarioID,
		arg.Nome,
		arg.FuncaoProfissionalID,
		arg.Endereco,
		arg.Cidade,
		arg.Uf,
		arg.Whatsapp,
		arg.CpfCnpjTitular,
		arg.Banco,
		arg.Agencia,
		arg.ContaPix,
		arg.CarroDisponivel,
		arg.TemEstudio,
		arg.QtdEstudio,
		arg.TipoCartao,
		arg.Observacao,
		arg.QualTec,
		arg.EducacaoSimpatia,
		arg.DesempenhoEvento,
		arg.DispHorario,
		arg.Media,
		arg.TabelaFree,
		arg.ExtraPorEquipamento,
		arg.Equipamentos,
		arg.Email,
		arg.AvatarUrl,
	)
	var i CadastroProfissionai
	err := row.Scan(
		&i.ID,
		&i.UsuarioID,
		&i.Nome,
		&i.FuncaoProfissionalID,
		&i.Endereco,
		&i.Cidade,
		&i.Uf,
		&i.Whatsapp,
		&i.CpfCnpjTitular,
		&i.Banco,
		&i.Agencia,
		&i.ContaPix,
		&i.CarroDisponivel,
		&i.TemEstudio,
		&i.QtdEstudio,
		&i.TipoCartao,
		&i.Observacao,
		&i.QualTec,
		&i.EducacaoSimpatia,
		&i.DesempenhoEvento,
		&i.DispHorario,
		&i.Media,
		&i.TabelaFree,
		&i.ExtraPorEquipamento,
		&i.Equipamentos,
		&i.Email,
		&i.AvatarUrl,
		&i.CriadoEm,
		&i.AtualizadoEm,
	)
	return i, err
}

const deleteProfessionalFunctions = `-- name: DeleteProfessionalFunctions :exec
DELETE FROM profissionais_funcoes_junction WHERE profissional_id = $1
`

func (q *Queries) DeleteProfessionalFunctions(ctx context.Context, profissionalID pgtype.UUID) error {
	_, err := q.db.Exec(ctx, deleteProfessionalFunctions, profissionalID)
	return err
}

const deleteProfissional = `-- name: DeleteProfissional :exec
DELETE FROM cadastro_profissionais
WHERE id = $1
`

func (q *Queries) DeleteProfissional(ctx context.Context, id pgtype.UUID) error {
	_, err := q.db.Exec(ctx, deleteProfissional, id)
	return err
}

const getProfissionalByID = `-- name: GetProfissionalByID :one
SELECT p.id, p.usuario_id, p.nome, p.funcao_profissional_id, p.endereco, p.cidade, p.uf, p.whatsapp, p.cpf_cnpj_titular, p.banco, p.agencia, p.conta_pix, p.carro_disponivel, p.tem_estudio, p.qtd_estudio, p.tipo_cartao, p.observacao, p.qual_tec, p.educacao_simpatia, p.desempenho_evento, p.disp_horario, p.media, p.tabela_free, p.extra_por_equipamento, p.equipamentos, p.email, p.avatar_url, p.criado_em, p.atualizado_em, 
    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 LIMIT 1
`

type GetProfissionalByIDRow struct {
	ID                   pgtype.UUID        `json:"id"`
	UsuarioID            pgtype.UUID        `json:"usuario_id"`
	Nome                 string             `json:"nome"`
	FuncaoProfissionalID pgtype.UUID        `json:"funcao_profissional_id"`
	Endereco             pgtype.Text        `json:"endereco"`
	Cidade               pgtype.Text        `json:"cidade"`
	Uf                   pgtype.Text        `json:"uf"`
	Whatsapp             pgtype.Text        `json:"whatsapp"`
	CpfCnpjTitular       pgtype.Text        `json:"cpf_cnpj_titular"`
	Banco                pgtype.Text        `json:"banco"`
	Agencia              pgtype.Text        `json:"agencia"`
	ContaPix             pgtype.Text        `json:"conta_pix"`
	CarroDisponivel      pgtype.Bool        `json:"carro_disponivel"`
	TemEstudio           pgtype.Bool        `json:"tem_estudio"`
	QtdEstudio           pgtype.Int4        `json:"qtd_estudio"`
	TipoCartao           pgtype.Text        `json:"tipo_cartao"`
	Observacao           pgtype.Text        `json:"observacao"`
	QualTec              pgtype.Int4        `json:"qual_tec"`
	EducacaoSimpatia     pgtype.Int4        `json:"educacao_simpatia"`
	DesempenhoEvento     pgtype.Int4        `json:"desempenho_evento"`
	DispHorario          pgtype.Int4        `json:"disp_horario"`
	Media                pgtype.Numeric     `json:"media"`
	TabelaFree           pgtype.Text        `json:"tabela_free"`
	ExtraPorEquipamento  pgtype.Bool        `json:"extra_por_equipamento"`
	Equipamentos         pgtype.Text        `json:"equipamentos"`
	Email                pgtype.Text        `json:"email"`
	AvatarUrl            pgtype.Text        `json:"avatar_url"`
	CriadoEm             pgtype.Timestamptz `json:"criado_em"`
	AtualizadoEm         pgtype.Timestamptz `json:"atualizado_em"`
	Functions            interface{}        `json:"functions"`
}

func (q *Queries) GetProfissionalByID(ctx context.Context, id pgtype.UUID) (GetProfissionalByIDRow, error) {
	row := q.db.QueryRow(ctx, getProfissionalByID, id)
	var i GetProfissionalByIDRow
	err := row.Scan(
		&i.ID,
		&i.UsuarioID,
		&i.Nome,
		&i.FuncaoProfissionalID,
		&i.Endereco,
		&i.Cidade,
		&i.Uf,
		&i.Whatsapp,
		&i.CpfCnpjTitular,
		&i.Banco,
		&i.Agencia,
		&i.ContaPix,
		&i.CarroDisponivel,
		&i.TemEstudio,
		&i.QtdEstudio,
		&i.TipoCartao,
		&i.Observacao,
		&i.QualTec,
		&i.EducacaoSimpatia,
		&i.DesempenhoEvento,
		&i.DispHorario,
		&i.Media,
		&i.TabelaFree,
		&i.ExtraPorEquipamento,
		&i.Equipamentos,
		&i.Email,
		&i.AvatarUrl,
		&i.CriadoEm,
		&i.AtualizadoEm,
		&i.Functions,
	)
	return i, err
}

const getProfissionalByUsuarioID = `-- name: GetProfissionalByUsuarioID :one
SELECT p.id, p.usuario_id, p.nome, p.funcao_profissional_id, p.endereco, p.cidade, p.uf, p.whatsapp, p.cpf_cnpj_titular, p.banco, p.agencia, p.conta_pix, p.carro_disponivel, p.tem_estudio, p.qtd_estudio, p.tipo_cartao, p.observacao, p.qual_tec, p.educacao_simpatia, p.desempenho_evento, p.disp_horario, p.media, p.tabela_free, p.extra_por_equipamento, p.equipamentos, p.email, p.avatar_url, p.criado_em, p.atualizado_em, 
    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.usuario_id = $1 LIMIT 1
`

type GetProfissionalByUsuarioIDRow struct {
	ID                   pgtype.UUID        `json:"id"`
	UsuarioID            pgtype.UUID        `json:"usuario_id"`
	Nome                 string             `json:"nome"`
	FuncaoProfissionalID pgtype.UUID        `json:"funcao_profissional_id"`
	Endereco             pgtype.Text        `json:"endereco"`
	Cidade               pgtype.Text        `json:"cidade"`
	Uf                   pgtype.Text        `json:"uf"`
	Whatsapp             pgtype.Text        `json:"whatsapp"`
	CpfCnpjTitular       pgtype.Text        `json:"cpf_cnpj_titular"`
	Banco                pgtype.Text        `json:"banco"`
	Agencia              pgtype.Text        `json:"agencia"`
	ContaPix             pgtype.Text        `json:"conta_pix"`
	CarroDisponivel      pgtype.Bool        `json:"carro_disponivel"`
	TemEstudio           pgtype.Bool        `json:"tem_estudio"`
	QtdEstudio           pgtype.Int4        `json:"qtd_estudio"`
	TipoCartao           pgtype.Text        `json:"tipo_cartao"`
	Observacao           pgtype.Text        `json:"observacao"`
	QualTec              pgtype.Int4        `json:"qual_tec"`
	EducacaoSimpatia     pgtype.Int4        `json:"educacao_simpatia"`
	DesempenhoEvento     pgtype.Int4        `json:"desempenho_evento"`
	DispHorario          pgtype.Int4        `json:"disp_horario"`
	Media                pgtype.Numeric     `json:"media"`
	TabelaFree           pgtype.Text        `json:"tabela_free"`
	ExtraPorEquipamento  pgtype.Bool        `json:"extra_por_equipamento"`
	Equipamentos         pgtype.Text        `json:"equipamentos"`
	Email                pgtype.Text        `json:"email"`
	AvatarUrl            pgtype.Text        `json:"avatar_url"`
	CriadoEm             pgtype.Timestamptz `json:"criado_em"`
	AtualizadoEm         pgtype.Timestamptz `json:"atualizado_em"`
	Functions            interface{}        `json:"functions"`
}

func (q *Queries) GetProfissionalByUsuarioID(ctx context.Context, usuarioID pgtype.UUID) (GetProfissionalByUsuarioIDRow, error) {
	row := q.db.QueryRow(ctx, getProfissionalByUsuarioID, usuarioID)
	var i GetProfissionalByUsuarioIDRow
	err := row.Scan(
		&i.ID,
		&i.UsuarioID,
		&i.Nome,
		&i.FuncaoProfissionalID,
		&i.Endereco,
		&i.Cidade,
		&i.Uf,
		&i.Whatsapp,
		&i.CpfCnpjTitular,
		&i.Banco,
		&i.Agencia,
		&i.ContaPix,
		&i.CarroDisponivel,
		&i.TemEstudio,
		&i.QtdEstudio,
		&i.TipoCartao,
		&i.Observacao,
		&i.QualTec,
		&i.EducacaoSimpatia,
		&i.DesempenhoEvento,
		&i.DispHorario,
		&i.Media,
		&i.TabelaFree,
		&i.ExtraPorEquipamento,
		&i.Equipamentos,
		&i.Email,
		&i.AvatarUrl,
		&i.CriadoEm,
		&i.AtualizadoEm,
		&i.Functions,
	)
	return i, err
}

const listProfissionais = `-- name: ListProfissionais :many
SELECT p.id, p.usuario_id, p.nome, p.funcao_profissional_id, p.endereco, p.cidade, p.uf, p.whatsapp, p.cpf_cnpj_titular, p.banco, p.agencia, p.conta_pix, p.carro_disponivel, p.tem_estudio, p.qtd_estudio, p.tipo_cartao, p.observacao, p.qual_tec, p.educacao_simpatia, p.desempenho_evento, p.disp_horario, p.media, p.tabela_free, p.extra_por_equipamento, p.equipamentos, p.email, p.avatar_url, p.criado_em, p.atualizado_em, 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
ORDER BY p.nome
`

type ListProfissionaisRow struct {
	ID                   pgtype.UUID        `json:"id"`
	UsuarioID            pgtype.UUID        `json:"usuario_id"`
	Nome                 string             `json:"nome"`
	FuncaoProfissionalID pgtype.UUID        `json:"funcao_profissional_id"`
	Endereco             pgtype.Text        `json:"endereco"`
	Cidade               pgtype.Text        `json:"cidade"`
	Uf                   pgtype.Text        `json:"uf"`
	Whatsapp             pgtype.Text        `json:"whatsapp"`
	CpfCnpjTitular       pgtype.Text        `json:"cpf_cnpj_titular"`
	Banco                pgtype.Text        `json:"banco"`
	Agencia              pgtype.Text        `json:"agencia"`
	ContaPix             pgtype.Text        `json:"conta_pix"`
	CarroDisponivel      pgtype.Bool        `json:"carro_disponivel"`
	TemEstudio           pgtype.Bool        `json:"tem_estudio"`
	QtdEstudio           pgtype.Int4        `json:"qtd_estudio"`
	TipoCartao           pgtype.Text        `json:"tipo_cartao"`
	Observacao           pgtype.Text        `json:"observacao"`
	QualTec              pgtype.Int4        `json:"qual_tec"`
	EducacaoSimpatia     pgtype.Int4        `json:"educacao_simpatia"`
	DesempenhoEvento     pgtype.Int4        `json:"desempenho_evento"`
	DispHorario          pgtype.Int4        `json:"disp_horario"`
	Media                pgtype.Numeric     `json:"media"`
	TabelaFree           pgtype.Text        `json:"tabela_free"`
	ExtraPorEquipamento  pgtype.Bool        `json:"extra_por_equipamento"`
	Equipamentos         pgtype.Text        `json:"equipamentos"`
	Email                pgtype.Text        `json:"email"`
	AvatarUrl            pgtype.Text        `json:"avatar_url"`
	CriadoEm             pgtype.Timestamptz `json:"criado_em"`
	AtualizadoEm         pgtype.Timestamptz `json:"atualizado_em"`
	UsuarioEmail         pgtype.Text        `json:"usuario_email"`
	Functions            interface{}        `json:"functions"`
}

func (q *Queries) ListProfissionais(ctx context.Context) ([]ListProfissionaisRow, error) {
	rows, err := q.db.Query(ctx, listProfissionais)
	if err != nil {
		return nil, err
	}
	defer rows.Close()
	var items []ListProfissionaisRow
	for rows.Next() {
		var i ListProfissionaisRow
		if err := rows.Scan(
			&i.ID,
			&i.UsuarioID,
			&i.Nome,
			&i.FuncaoProfissionalID,
			&i.Endereco,
			&i.Cidade,
			&i.Uf,
			&i.Whatsapp,
			&i.CpfCnpjTitular,
			&i.Banco,
			&i.Agencia,
			&i.ContaPix,
			&i.CarroDisponivel,
			&i.TemEstudio,
			&i.QtdEstudio,
			&i.TipoCartao,
			&i.Observacao,
			&i.QualTec,
			&i.EducacaoSimpatia,
			&i.DesempenhoEvento,
			&i.DispHorario,
			&i.Media,
			&i.TabelaFree,
			&i.ExtraPorEquipamento,
			&i.Equipamentos,
			&i.Email,
			&i.AvatarUrl,
			&i.CriadoEm,
			&i.AtualizadoEm,
			&i.UsuarioEmail,
			&i.Functions,
		); err != nil {
			return nil, err
		}
		items = append(items, i)
	}
	if err := rows.Err(); err != nil {
		return nil, err
	}
	return items, nil
}

const searchProfissionais = `-- name: SearchProfissionais :many
SELECT p.id, p.usuario_id, p.nome, p.funcao_profissional_id, p.endereco, p.cidade, p.uf, p.whatsapp, p.cpf_cnpj_titular, p.banco, p.agencia, p.conta_pix, p.carro_disponivel, p.tem_estudio, p.qtd_estudio, p.tipo_cartao, p.observacao, p.qual_tec, p.educacao_simpatia, p.desempenho_evento, p.disp_horario, p.media, p.tabela_free, p.extra_por_equipamento, p.equipamentos, p.email, p.avatar_url, p.criado_em, p.atualizado_em, 
    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 || '%'
ORDER BY p.nome
LIMIT 20
`

type SearchProfissionaisRow struct {
	ID                   pgtype.UUID        `json:"id"`
	UsuarioID            pgtype.UUID        `json:"usuario_id"`
	Nome                 string             `json:"nome"`
	FuncaoProfissionalID pgtype.UUID        `json:"funcao_profissional_id"`
	Endereco             pgtype.Text        `json:"endereco"`
	Cidade               pgtype.Text        `json:"cidade"`
	Uf                   pgtype.Text        `json:"uf"`
	Whatsapp             pgtype.Text        `json:"whatsapp"`
	CpfCnpjTitular       pgtype.Text        `json:"cpf_cnpj_titular"`
	Banco                pgtype.Text        `json:"banco"`
	Agencia              pgtype.Text        `json:"agencia"`
	ContaPix             pgtype.Text        `json:"conta_pix"`
	CarroDisponivel      pgtype.Bool        `json:"carro_disponivel"`
	TemEstudio           pgtype.Bool        `json:"tem_estudio"`
	QtdEstudio           pgtype.Int4        `json:"qtd_estudio"`
	TipoCartao           pgtype.Text        `json:"tipo_cartao"`
	Observacao           pgtype.Text        `json:"observacao"`
	QualTec              pgtype.Int4        `json:"qual_tec"`
	EducacaoSimpatia     pgtype.Int4        `json:"educacao_simpatia"`
	DesempenhoEvento     pgtype.Int4        `json:"desempenho_evento"`
	DispHorario          pgtype.Int4        `json:"disp_horario"`
	Media                pgtype.Numeric     `json:"media"`
	TabelaFree           pgtype.Text        `json:"tabela_free"`
	ExtraPorEquipamento  pgtype.Bool        `json:"extra_por_equipamento"`
	Equipamentos         pgtype.Text        `json:"equipamentos"`
	Email                pgtype.Text        `json:"email"`
	AvatarUrl            pgtype.Text        `json:"avatar_url"`
	CriadoEm             pgtype.Timestamptz `json:"criado_em"`
	AtualizadoEm         pgtype.Timestamptz `json:"atualizado_em"`
	Functions            interface{}        `json:"functions"`
}

func (q *Queries) SearchProfissionais(ctx context.Context, dollar_1 pgtype.Text) ([]SearchProfissionaisRow, error) {
	rows, err := q.db.Query(ctx, searchProfissionais, dollar_1)
	if err != nil {
		return nil, err
	}
	defer rows.Close()
	var items []SearchProfissionaisRow
	for rows.Next() {
		var i SearchProfissionaisRow
		if err := rows.Scan(
			&i.ID,
			&i.UsuarioID,
			&i.Nome,
			&i.FuncaoProfissionalID,
			&i.Endereco,
			&i.Cidade,
			&i.Uf,
			&i.Whatsapp,
			&i.CpfCnpjTitular,
			&i.Banco,
			&i.Agencia,
			&i.ContaPix,
			&i.CarroDisponivel,
			&i.TemEstudio,
			&i.QtdEstudio,
			&i.TipoCartao,
			&i.Observacao,
			&i.QualTec,
			&i.EducacaoSimpatia,
			&i.DesempenhoEvento,
			&i.DispHorario,
			&i.Media,
			&i.TabelaFree,
			&i.ExtraPorEquipamento,
			&i.Equipamentos,
			&i.Email,
			&i.AvatarUrl,
			&i.CriadoEm,
			&i.AtualizadoEm,
			&i.Functions,
		); err != nil {
			return nil, err
		}
		items = append(items, i)
	}
	if err := rows.Err(); err != nil {
		return nil, err
	}
	return items, nil
}

const searchProfissionaisByFunction = `-- name: SearchProfissionaisByFunction :many
SELECT p.id, p.usuario_id, p.nome, p.funcao_profissional_id, p.endereco, p.cidade, p.uf, p.whatsapp, p.cpf_cnpj_titular, p.banco, p.agencia, p.conta_pix, p.carro_disponivel, p.tem_estudio, p.qtd_estudio, p.tipo_cartao, p.observacao, p.qual_tec, p.educacao_simpatia, p.desempenho_evento, p.disp_horario, p.media, p.tabela_free, p.extra_por_equipamento, p.equipamentos, p.email, p.avatar_url, p.criado_em, p.atualizado_em, 
    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 (
      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
`

type SearchProfissionaisByFunctionParams struct {
	Column1 pgtype.Text `json:"column_1"`
	Nome    string      `json:"nome"`
}

type SearchProfissionaisByFunctionRow struct {
	ID                   pgtype.UUID        `json:"id"`
	UsuarioID            pgtype.UUID        `json:"usuario_id"`
	Nome                 string             `json:"nome"`
	FuncaoProfissionalID pgtype.UUID        `json:"funcao_profissional_id"`
	Endereco             pgtype.Text        `json:"endereco"`
	Cidade               pgtype.Text        `json:"cidade"`
	Uf                   pgtype.Text        `json:"uf"`
	Whatsapp             pgtype.Text        `json:"whatsapp"`
	CpfCnpjTitular       pgtype.Text        `json:"cpf_cnpj_titular"`
	Banco                pgtype.Text        `json:"banco"`
	Agencia              pgtype.Text        `json:"agencia"`
	ContaPix             pgtype.Text        `json:"conta_pix"`
	CarroDisponivel      pgtype.Bool        `json:"carro_disponivel"`
	TemEstudio           pgtype.Bool        `json:"tem_estudio"`
	QtdEstudio           pgtype.Int4        `json:"qtd_estudio"`
	TipoCartao           pgtype.Text        `json:"tipo_cartao"`
	Observacao           pgtype.Text        `json:"observacao"`
	QualTec              pgtype.Int4        `json:"qual_tec"`
	EducacaoSimpatia     pgtype.Int4        `json:"educacao_simpatia"`
	DesempenhoEvento     pgtype.Int4        `json:"desempenho_evento"`
	DispHorario          pgtype.Int4        `json:"disp_horario"`
	Media                pgtype.Numeric     `json:"media"`
	TabelaFree           pgtype.Text        `json:"tabela_free"`
	ExtraPorEquipamento  pgtype.Bool        `json:"extra_por_equipamento"`
	Equipamentos         pgtype.Text        `json:"equipamentos"`
	Email                pgtype.Text        `json:"email"`
	AvatarUrl            pgtype.Text        `json:"avatar_url"`
	CriadoEm             pgtype.Timestamptz `json:"criado_em"`
	AtualizadoEm         pgtype.Timestamptz `json:"atualizado_em"`
	Functions            interface{}        `json:"functions"`
}

func (q *Queries) SearchProfissionaisByFunction(ctx context.Context, arg SearchProfissionaisByFunctionParams) ([]SearchProfissionaisByFunctionRow, error) {
	rows, err := q.db.Query(ctx, searchProfissionaisByFunction, arg.Column1, arg.Nome)
	if err != nil {
		return nil, err
	}
	defer rows.Close()
	var items []SearchProfissionaisByFunctionRow
	for rows.Next() {
		var i SearchProfissionaisByFunctionRow
		if err := rows.Scan(
			&i.ID,
			&i.UsuarioID,
			&i.Nome,
			&i.FuncaoProfissionalID,
			&i.Endereco,
			&i.Cidade,
			&i.Uf,
			&i.Whatsapp,
			&i.CpfCnpjTitular,
			&i.Banco,
			&i.Agencia,
			&i.ContaPix,
			&i.CarroDisponivel,
			&i.TemEstudio,
			&i.QtdEstudio,
			&i.TipoCartao,
			&i.Observacao,
			&i.QualTec,
			&i.EducacaoSimpatia,
			&i.DesempenhoEvento,
			&i.DispHorario,
			&i.Media,
			&i.TabelaFree,
			&i.ExtraPorEquipamento,
			&i.Equipamentos,
			&i.Email,
			&i.AvatarUrl,
			&i.CriadoEm,
			&i.AtualizadoEm,
			&i.Functions,
		); err != nil {
			return nil, err
		}
		items = append(items, i)
	}
	if err := rows.Err(); err != nil {
		return nil, err
	}
	return items, nil
}

const updateProfissional = `-- name: UpdateProfissional :one
UPDATE cadastro_profissionais
SET
    nome = $2,
    funcao_profissional_id = $3,
    endereco = $4,
    cidade = $5,
    uf = $6,
    whatsapp = $7,
    cpf_cnpj_titular = $8,
    banco = $9,
    agencia = $10,
    conta_pix = $11,
    carro_disponivel = $12,
    tem_estudio = $13,
    qtd_estudio = $14,
    tipo_cartao = $15,
    observacao = $16,
    qual_tec = $17,
    educacao_simpatia = $18,
    desempenho_evento = $19,
    disp_horario = $20,
    media = $21,
    tabela_free = $22,
    extra_por_equipamento = $23,
    equipamentos = $24,
    avatar_url = $25,
    email = $26,
    atualizado_em = NOW()
WHERE id = $1
RETURNING id, usuario_id, nome, funcao_profissional_id, endereco, cidade, uf, whatsapp, cpf_cnpj_titular, banco, agencia, conta_pix, 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, criado_em, atualizado_em
`

type UpdateProfissionalParams struct {
	ID                   pgtype.UUID    `json:"id"`
	Nome                 string         `json:"nome"`
	FuncaoProfissionalID pgtype.UUID    `json:"funcao_profissional_id"`
	Endereco             pgtype.Text    `json:"endereco"`
	Cidade               pgtype.Text    `json:"cidade"`
	Uf                   pgtype.Text    `json:"uf"`
	Whatsapp             pgtype.Text    `json:"whatsapp"`
	CpfCnpjTitular       pgtype.Text    `json:"cpf_cnpj_titular"`
	Banco                pgtype.Text    `json:"banco"`
	Agencia              pgtype.Text    `json:"agencia"`
	ContaPix             pgtype.Text    `json:"conta_pix"`
	CarroDisponivel      pgtype.Bool    `json:"carro_disponivel"`
	TemEstudio           pgtype.Bool    `json:"tem_estudio"`
	QtdEstudio           pgtype.Int4    `json:"qtd_estudio"`
	TipoCartao           pgtype.Text    `json:"tipo_cartao"`
	Observacao           pgtype.Text    `json:"observacao"`
	QualTec              pgtype.Int4    `json:"qual_tec"`
	EducacaoSimpatia     pgtype.Int4    `json:"educacao_simpatia"`
	DesempenhoEvento     pgtype.Int4    `json:"desempenho_evento"`
	DispHorario          pgtype.Int4    `json:"disp_horario"`
	Media                pgtype.Numeric `json:"media"`
	TabelaFree           pgtype.Text    `json:"tabela_free"`
	ExtraPorEquipamento  pgtype.Bool    `json:"extra_por_equipamento"`
	Equipamentos         pgtype.Text    `json:"equipamentos"`
	AvatarUrl            pgtype.Text    `json:"avatar_url"`
	Email                pgtype.Text    `json:"email"`
}

func (q *Queries) UpdateProfissional(ctx context.Context, arg UpdateProfissionalParams) (CadastroProfissionai, error) {
	row := q.db.QueryRow(ctx, updateProfissional,
		arg.ID,
		arg.Nome,
		arg.FuncaoProfissionalID,
		arg.Endereco,
		arg.Cidade,
		arg.Uf,
		arg.Whatsapp,
		arg.CpfCnpjTitular,
		arg.Banco,
		arg.Agencia,
		arg.ContaPix,
		arg.CarroDisponivel,
		arg.TemEstudio,
		arg.QtdEstudio,
		arg.TipoCartao,
		arg.Observacao,
		arg.QualTec,
		arg.EducacaoSimpatia,
		arg.DesempenhoEvento,
		arg.DispHorario,
		arg.Media,
		arg.TabelaFree,
		arg.ExtraPorEquipamento,
		arg.Equipamentos,
		arg.AvatarUrl,
		arg.Email,
	)
	var i CadastroProfissionai
	err := row.Scan(
		&i.ID,
		&i.UsuarioID,
		&i.Nome,
		&i.FuncaoProfissionalID,
		&i.Endereco,
		&i.Cidade,
		&i.Uf,
		&i.Whatsapp,
		&i.CpfCnpjTitular,
		&i.Banco,
		&i.Agencia,
		&i.ContaPix,
		&i.CarroDisponivel,
		&i.TemEstudio,
		&i.QtdEstudio,
		&i.TipoCartao,
		&i.Observacao,
		&i.QualTec,
		&i.EducacaoSimpatia,
		&i.DesempenhoEvento,
		&i.DispHorario,
		&i.Media,
		&i.TabelaFree,
		&i.ExtraPorEquipamento,
		&i.Equipamentos,
		&i.Email,
		&i.AvatarUrl,
		&i.CriadoEm,
		&i.AtualizadoEm,
	)
	return i, err
}
