// Code generated by BobGen psql v0.42.5. DO NOT EDIT.
// This file is meant to be re-generated in place and/or deleted at any time.

package sql

import (
	"context"
	_ "embed"
	"io"
	"iter"

	"github.com/Gleipnir-Technology/bob"
	"github.com/Gleipnir-Technology/bob/clause"
	"github.com/Gleipnir-Technology/bob/dialect/psql"
	"github.com/Gleipnir-Technology/bob/dialect/psql/dialect"
	"github.com/Gleipnir-Technology/bob/orm"
	"github.com/aarondl/opt/null"
	"github.com/stephenafamo/scan"
)

//go:embed publicreport_publicid_suggestion.bob.sql
var formattedQueries_publicreport_publicid_suggestion string

var publicreportPublicIDSuggestionSQL = formattedQueries_publicreport_publicid_suggestion[168:426]

type PublicreportPublicIDSuggestionQuery = orm.ModQuery[*dialect.SelectQuery, publicreportPublicIDSuggestion, PublicreportPublicIDSuggestionRow, []PublicreportPublicIDSuggestionRow, publicreportPublicIDSuggestionTransformer]

func PublicreportPublicIDSuggestion(Arg1 string) *PublicreportPublicIDSuggestionQuery {
	var expressionTypArgs publicreportPublicIDSuggestion

	expressionTypArgs.Arg1 = psql.Arg(Arg1)

	return &PublicreportPublicIDSuggestionQuery{
		Query: orm.Query[publicreportPublicIDSuggestion, PublicreportPublicIDSuggestionRow, []PublicreportPublicIDSuggestionRow, publicreportPublicIDSuggestionTransformer]{
			ExecQuery: orm.ExecQuery[publicreportPublicIDSuggestion]{
				BaseQuery: bob.BaseQuery[publicreportPublicIDSuggestion]{
					Expression: expressionTypArgs,
					Dialect:    dialect.Dialect,
					QueryType:  bob.QueryTypeSelect,
				},
			},
			Scanner: func(context.Context, []string) (func(*scan.Row) (any, error), func(any) (PublicreportPublicIDSuggestionRow, error)) {
				return func(row *scan.Row) (any, error) {
						var t PublicreportPublicIDSuggestionRow
						row.ScheduleScanByIndex(0, &t.TableName)
						row.ScheduleScanByIndex(1, &t.PublicID)
						row.ScheduleScanByIndex(2, &t.Location)
						return &t, nil
					}, func(v any) (PublicreportPublicIDSuggestionRow, error) {
						return *(v.(*PublicreportPublicIDSuggestionRow)), nil
					}
			},
		},
		Mod: bob.ModFunc[*dialect.SelectQuery](func(q *dialect.SelectQuery) {
			q.AppendSelect(expressionTypArgs.subExpr(10, 59))
			q.SetTable(expressionTypArgs.subExpr(68, 89))
			q.AppendWhere(expressionTypArgs.subExpr(99, 116))

			q.AppendCombine(clause.Combine{
				Strategy: "UNION",
				All:      true,
				Query: bob.BaseQuery[bob.Expression]{
					Expression: expressionTypArgs.subExpr(129, 237),
					QueryType:  bob.QueryTypeSelect,
					Dialect:    dialect.Dialect,
				},
			})
			q.CombinedOrder.AppendOrder(expressionTypArgs.subExpr(249, 258))
		}),
	}
}

type PublicreportPublicIDSuggestionRow = struct {
	TableName string           `db:"table_name"`
	PublicID  string           `db:"public_id"`
	Location  null.Val[string] `db:"location"`
}

type publicreportPublicIDSuggestionTransformer = bob.SliceTransformer[PublicreportPublicIDSuggestionRow, []PublicreportPublicIDSuggestionRow]

type publicreportPublicIDSuggestion struct {
	Arg1 bob.Expression
}

func (o publicreportPublicIDSuggestion) args() iter.Seq[orm.ArgWithPosition] {
	return func(yield func(arg orm.ArgWithPosition) bool) {
		if !yield(orm.ArgWithPosition{
			Name:       "arg1",
			Start:      114,
			Stop:       116,
			Expression: o.Arg1,
		}) {
			return
		}

		if !yield(orm.ArgWithPosition{
			Name:       "arg1",
			Start:      235,
			Stop:       237,
			Expression: o.Arg1,
		}) {
			return
		}
	}
}

func (o publicreportPublicIDSuggestion) raw(from, to int) string {
	return publicreportPublicIDSuggestionSQL[from:to]
}

func (o publicreportPublicIDSuggestion) subExpr(from, to int) bob.Expression {
	return orm.ArgsToExpression(publicreportPublicIDSuggestionSQL, from, to, o.args())
}

func (o publicreportPublicIDSuggestion) WriteSQL(ctx context.Context, w io.StringWriter, d bob.Dialect, start int) ([]any, error) {
	return o.subExpr(0, len(publicreportPublicIDSuggestionSQL)).WriteSQL(ctx, w, d, start)
}
