// 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,
    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, $32
) 
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 id, usuario_id, nome, funcao_profissional_id, endereco, cidade, uf, whatsapp, cep, numero, complemento, bairro, cpf_cnpj_titular, banco, agencia, conta, 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, regiao
`

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"`
	Conta                pgtype.Text    `json:"conta"`
	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"`
	Cep                  pgtype.Text    `json:"cep"`
	Numero               pgtype.Text    `json:"numero"`
	Complemento          pgtype.Text    `json:"complemento"`
	Bairro               pgtype.Text    `json:"bairro"`
	Regiao               pgtype.Text    `json:"regiao"`
}

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.Conta,
		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,
		arg.Cep,
		arg.Numero,
		arg.Complemento,
		arg.Bairro,
		arg.Regiao,
	)
	var i CadastroProfissionai
	err := row.Scan(
		&i.ID,
		&i.UsuarioID,
		&i.Nome,
		&i.FuncaoProfissionalID,
		&i.Endereco,
		&i.Cidade,
		&i.Uf,
		&i.Whatsapp,
		&i.Cep,
		&i.Numero,
		&i.Complemento,
		&i.Bairro,
		&i.CpfCnpjTitular,
		&i.Banco,
		&i.Agencia,
		&i.Conta,
		&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.Regiao,
	)
	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 AND regiao = $2
`

type DeleteProfissionalParams struct {
	ID     pgtype.UUID `json:"id"`
	Regiao pgtype.Text `json:"regiao"`
}

func (q *Queries) DeleteProfissional(ctx context.Context, arg DeleteProfissionalParams) error {
	_, err := q.db.Exec(ctx, deleteProfissional, arg.ID, arg.Regiao)
	return err
}

const getProfissionalByCPF = `-- name: GetProfissionalByCPF :one
SELECT p.id, p.usuario_id, p.nome, p.funcao_profissional_id, p.endereco, p.cidade, p.uf, p.whatsapp, p.cep, p.numero, p.complemento, p.bairro, p.cpf_cnpj_titular, p.banco, p.agencia, p.conta, 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, p.regiao, 
    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 = $2 LIMIT 1
`

type GetProfissionalByCPFParams struct {
	CpfCnpjTitular pgtype.Text `json:"cpf_cnpj_titular"`
	Regiao         pgtype.Text `json:"regiao"`
}

type GetProfissionalByCPFRow 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"`
	Cep                  pgtype.Text        `json:"cep"`
	Numero               pgtype.Text        `json:"numero"`
	Complemento          pgtype.Text        `json:"complemento"`
	Bairro               pgtype.Text        `json:"bairro"`
	CpfCnpjTitular       pgtype.Text        `json:"cpf_cnpj_titular"`
	Banco                pgtype.Text        `json:"banco"`
	Agencia              pgtype.Text        `json:"agencia"`
	Conta                pgtype.Text        `json:"conta"`
	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"`
	Regiao               pgtype.Text        `json:"regiao"`
	Functions            interface{}        `json:"functions"`
}

func (q *Queries) GetProfissionalByCPF(ctx context.Context, arg GetProfissionalByCPFParams) (GetProfissionalByCPFRow, error) {
	row := q.db.QueryRow(ctx, getProfissionalByCPF, arg.CpfCnpjTitular, arg.Regiao)
	var i GetProfissionalByCPFRow
	err := row.Scan(
		&i.ID,
		&i.UsuarioID,
		&i.Nome,
		&i.FuncaoProfissionalID,
		&i.Endereco,
		&i.Cidade,
		&i.Uf,
		&i.Whatsapp,
		&i.Cep,
		&i.Numero,
		&i.Complemento,
		&i.Bairro,
		&i.CpfCnpjTitular,
		&i.Banco,
		&i.Agencia,
		&i.Conta,
		&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.Regiao,
		&i.Functions,
	)
	return i, 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.cep, p.numero, p.complemento, p.bairro, p.cpf_cnpj_titular, p.banco, p.agencia, p.conta, 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, p.regiao, 
    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 = $2 LIMIT 1
`

type GetProfissionalByIDParams struct {
	ID     pgtype.UUID `json:"id"`
	Regiao pgtype.Text `json:"regiao"`
}

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"`
	Cep                  pgtype.Text        `json:"cep"`
	Numero               pgtype.Text        `json:"numero"`
	Complemento          pgtype.Text        `json:"complemento"`
	Bairro               pgtype.Text        `json:"bairro"`
	CpfCnpjTitular       pgtype.Text        `json:"cpf_cnpj_titular"`
	Banco                pgtype.Text        `json:"banco"`
	Agencia              pgtype.Text        `json:"agencia"`
	Conta                pgtype.Text        `json:"conta"`
	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"`
	Regiao               pgtype.Text        `json:"regiao"`
	Functions            interface{}        `json:"functions"`
}

func (q *Queries) GetProfissionalByID(ctx context.Context, arg GetProfissionalByIDParams) (GetProfissionalByIDRow, error) {
	row := q.db.QueryRow(ctx, getProfissionalByID, arg.ID, arg.Regiao)
	var i GetProfissionalByIDRow
	err := row.Scan(
		&i.ID,
		&i.UsuarioID,
		&i.Nome,
		&i.FuncaoProfissionalID,
		&i.Endereco,
		&i.Cidade,
		&i.Uf,
		&i.Whatsapp,
		&i.Cep,
		&i.Numero,
		&i.Complemento,
		&i.Bairro,
		&i.CpfCnpjTitular,
		&i.Banco,
		&i.Agencia,
		&i.Conta,
		&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.Regiao,
		&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.cep, p.numero, p.complemento, p.bairro, p.cpf_cnpj_titular, p.banco, p.agencia, p.conta, 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, p.regiao, 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
`

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"`
	Cep                  pgtype.Text        `json:"cep"`
	Numero               pgtype.Text        `json:"numero"`
	Complemento          pgtype.Text        `json:"complemento"`
	Bairro               pgtype.Text        `json:"bairro"`
	CpfCnpjTitular       pgtype.Text        `json:"cpf_cnpj_titular"`
	Banco                pgtype.Text        `json:"banco"`
	Agencia              pgtype.Text        `json:"agencia"`
	Conta                pgtype.Text        `json:"conta"`
	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"`
	Regiao               pgtype.Text        `json:"regiao"`
	UsuarioEmail         pgtype.Text        `json:"usuario_email"`
	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.Cep,
		&i.Numero,
		&i.Complemento,
		&i.Bairro,
		&i.CpfCnpjTitular,
		&i.Banco,
		&i.Agencia,
		&i.Conta,
		&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.Regiao,
		&i.UsuarioEmail,
		&i.Functions,
	)
	return i, err
}

const linkProfissionalToUsuario = `-- name: LinkProfissionalToUsuario :exec
UPDATE cadastro_profissionais
SET usuario_id = $2
WHERE id = $1 AND regiao = $3
`

type LinkProfissionalToUsuarioParams struct {
	ID        pgtype.UUID `json:"id"`
	UsuarioID pgtype.UUID `json:"usuario_id"`
	Regiao    pgtype.Text `json:"regiao"`
}

func (q *Queries) LinkProfissionalToUsuario(ctx context.Context, arg LinkProfissionalToUsuarioParams) error {
	_, err := q.db.Exec(ctx, linkProfissionalToUsuario, arg.ID, arg.UsuarioID, arg.Regiao)
	return err
}

const linkUserToProfessional = `-- name: LinkUserToProfessional :exec
UPDATE cadastro_profissionais SET usuario_id = $2 WHERE id = $1
`

type LinkUserToProfessionalParams struct {
	ID        pgtype.UUID `json:"id"`
	UsuarioID pgtype.UUID `json:"usuario_id"`
}

func (q *Queries) LinkUserToProfessional(ctx context.Context, arg LinkUserToProfessionalParams) error {
	_, err := q.db.Exec(ctx, linkUserToProfessional, arg.ID, arg.UsuarioID)
	return 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.cep, p.numero, p.complemento, p.bairro, p.cpf_cnpj_titular, p.banco, p.agencia, p.conta, 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, p.regiao, 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 = $1
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"`
	Cep                  pgtype.Text        `json:"cep"`
	Numero               pgtype.Text        `json:"numero"`
	Complemento          pgtype.Text        `json:"complemento"`
	Bairro               pgtype.Text        `json:"bairro"`
	CpfCnpjTitular       pgtype.Text        `json:"cpf_cnpj_titular"`
	Banco                pgtype.Text        `json:"banco"`
	Agencia              pgtype.Text        `json:"agencia"`
	Conta                pgtype.Text        `json:"conta"`
	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"`
	Regiao               pgtype.Text        `json:"regiao"`
	UsuarioEmail         pgtype.Text        `json:"usuario_email"`
	Functions            interface{}        `json:"functions"`
}

func (q *Queries) ListProfissionais(ctx context.Context, regiao pgtype.Text) ([]ListProfissionaisRow, error) {
	rows, err := q.db.Query(ctx, listProfissionais, regiao)
	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.Cep,
			&i.Numero,
			&i.Complemento,
			&i.Bairro,
			&i.CpfCnpjTitular,
			&i.Banco,
			&i.Agencia,
			&i.Conta,
			&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.Regiao,
			&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.cep, p.numero, p.complemento, p.bairro, p.cpf_cnpj_titular, p.banco, p.agencia, p.conta, 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, p.regiao, 
    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 = $2
ORDER BY p.nome
LIMIT 20
`

type SearchProfissionaisParams struct {
	Column1 pgtype.Text `json:"column_1"`
	Regiao  pgtype.Text `json:"regiao"`
}

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"`
	Cep                  pgtype.Text        `json:"cep"`
	Numero               pgtype.Text        `json:"numero"`
	Complemento          pgtype.Text        `json:"complemento"`
	Bairro               pgtype.Text        `json:"bairro"`
	CpfCnpjTitular       pgtype.Text        `json:"cpf_cnpj_titular"`
	Banco                pgtype.Text        `json:"banco"`
	Agencia              pgtype.Text        `json:"agencia"`
	Conta                pgtype.Text        `json:"conta"`
	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"`
	Regiao               pgtype.Text        `json:"regiao"`
	Functions            interface{}        `json:"functions"`
}

func (q *Queries) SearchProfissionais(ctx context.Context, arg SearchProfissionaisParams) ([]SearchProfissionaisRow, error) {
	rows, err := q.db.Query(ctx, searchProfissionais, arg.Column1, arg.Regiao)
	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.Cep,
			&i.Numero,
			&i.Complemento,
			&i.Bairro,
			&i.CpfCnpjTitular,
			&i.Banco,
			&i.Agencia,
			&i.Conta,
			&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.Regiao,
			&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.cep, p.numero, p.complemento, p.bairro, p.cpf_cnpj_titular, p.banco, p.agencia, p.conta, 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, p.regiao, 
    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 = $3
  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"`
	Regiao  pgtype.Text `json:"regiao"`
}

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"`
	Cep                  pgtype.Text        `json:"cep"`
	Numero               pgtype.Text        `json:"numero"`
	Complemento          pgtype.Text        `json:"complemento"`
	Bairro               pgtype.Text        `json:"bairro"`
	CpfCnpjTitular       pgtype.Text        `json:"cpf_cnpj_titular"`
	Banco                pgtype.Text        `json:"banco"`
	Agencia              pgtype.Text        `json:"agencia"`
	Conta                pgtype.Text        `json:"conta"`
	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"`
	Regiao               pgtype.Text        `json:"regiao"`
	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, arg.Regiao)
	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.Cep,
			&i.Numero,
			&i.Complemento,
			&i.Bairro,
			&i.CpfCnpjTitular,
			&i.Banco,
			&i.Agencia,
			&i.Conta,
			&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.Regiao,
			&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,
    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 = $32
RETURNING id, usuario_id, nome, funcao_profissional_id, endereco, cidade, uf, whatsapp, cep, numero, complemento, bairro, cpf_cnpj_titular, banco, agencia, conta, 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, regiao
`

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"`
	Conta                pgtype.Text    `json:"conta"`
	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"`
	Cep                  pgtype.Text    `json:"cep"`
	Numero               pgtype.Text    `json:"numero"`
	Complemento          pgtype.Text    `json:"complemento"`
	Bairro               pgtype.Text    `json:"bairro"`
	Regiao               pgtype.Text    `json:"regiao"`
}

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.Conta,
		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,
		arg.Cep,
		arg.Numero,
		arg.Complemento,
		arg.Bairro,
		arg.Regiao,
	)
	var i CadastroProfissionai
	err := row.Scan(
		&i.ID,
		&i.UsuarioID,
		&i.Nome,
		&i.FuncaoProfissionalID,
		&i.Endereco,
		&i.Cidade,
		&i.Uf,
		&i.Whatsapp,
		&i.Cep,
		&i.Numero,
		&i.Complemento,
		&i.Bairro,
		&i.CpfCnpjTitular,
		&i.Banco,
		&i.Agencia,
		&i.Conta,
		&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.Regiao,
	)
	return i, err
}
