// Code generated by sqlc. DO NOT EDIT.
// versions:
//   sqlc v1.31.1
// source: memory.sql

package projectmemorysqlc

import (
	"context"

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

const deleteEntry = `-- name: DeleteEntry :exec
DELETE FROM project_memory WHERE id = $1
`

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

const getEntry = `-- name: GetEntry :one
SELECT id, project_id, workspace_id, kind, title, body, tags, source,
       embedding_model, created_by, created_at, updated_at
FROM project_memory
WHERE id = $1
`

type GetEntryRow struct {
	ID             pgtype.UUID        `json:"id"`
	ProjectID      pgtype.UUID        `json:"project_id"`
	WorkspaceID    pgtype.UUID        `json:"workspace_id"`
	Kind           string             `json:"kind"`
	Title          string             `json:"title"`
	Body           string             `json:"body"`
	Tags           []string           `json:"tags"`
	Source         string             `json:"source"`
	EmbeddingModel *string            `json:"embedding_model"`
	CreatedBy      pgtype.UUID        `json:"created_by"`
	CreatedAt      pgtype.Timestamptz `json:"created_at"`
	UpdatedAt      pgtype.Timestamptz `json:"updated_at"`
}

func (q *Queries) GetEntry(ctx context.Context, id pgtype.UUID) (GetEntryRow, error) {
	row := q.db.QueryRow(ctx, getEntry, id)
	var i GetEntryRow
	err := row.Scan(
		&i.ID,
		&i.ProjectID,
		&i.WorkspaceID,
		&i.Kind,
		&i.Title,
		&i.Body,
		&i.Tags,
		&i.Source,
		&i.EmbeddingModel,
		&i.CreatedBy,
		&i.CreatedAt,
		&i.UpdatedAt,
	)
	return i, err
}

const insertEntry = `-- name: InsertEntry :one

INSERT INTO project_memory (
  id, project_id, workspace_id, kind, title, body, tags, source,
  embedding_model, created_by
) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)
RETURNING id, project_id, workspace_id, kind, title, body, tags, source,
          embedding_model, created_by, created_at, updated_at
`

type InsertEntryParams struct {
	ID             pgtype.UUID `json:"id"`
	ProjectID      pgtype.UUID `json:"project_id"`
	WorkspaceID    pgtype.UUID `json:"workspace_id"`
	Kind           string      `json:"kind"`
	Title          string      `json:"title"`
	Body           string      `json:"body"`
	Tags           []string    `json:"tags"`
	Source         string      `json:"source"`
	EmbeddingModel *string     `json:"embedding_model"`
	CreatedBy      pgtype.UUID `json:"created_by"`
}

type InsertEntryRow struct {
	ID             pgtype.UUID        `json:"id"`
	ProjectID      pgtype.UUID        `json:"project_id"`
	WorkspaceID    pgtype.UUID        `json:"workspace_id"`
	Kind           string             `json:"kind"`
	Title          string             `json:"title"`
	Body           string             `json:"body"`
	Tags           []string           `json:"tags"`
	Source         string             `json:"source"`
	EmbeddingModel *string            `json:"embedding_model"`
	CreatedBy      pgtype.UUID        `json:"created_by"`
	CreatedAt      pgtype.Timestamptz `json:"created_at"`
	UpdatedAt      pgtype.Timestamptz `json:"updated_at"`
}

// The embedding (vector) column is excluded from sqlc queries (no native pgvector
// type). Write sets embedding via a hand-written pgx UPDATE; vector KNN search is
// hand-written in repository.go. These queries cover the non-vector path.
func (q *Queries) InsertEntry(ctx context.Context, arg InsertEntryParams) (InsertEntryRow, error) {
	row := q.db.QueryRow(ctx, insertEntry,
		arg.ID,
		arg.ProjectID,
		arg.WorkspaceID,
		arg.Kind,
		arg.Title,
		arg.Body,
		arg.Tags,
		arg.Source,
		arg.EmbeddingModel,
		arg.CreatedBy,
	)
	var i InsertEntryRow
	err := row.Scan(
		&i.ID,
		&i.ProjectID,
		&i.WorkspaceID,
		&i.Kind,
		&i.Title,
		&i.Body,
		&i.Tags,
		&i.Source,
		&i.EmbeddingModel,
		&i.CreatedBy,
		&i.CreatedAt,
		&i.UpdatedAt,
	)
	return i, err
}

const listByProject = `-- name: ListByProject :many
SELECT id, project_id, workspace_id, kind, title, body, tags, source,
       embedding_model, created_by, created_at, updated_at
FROM project_memory
WHERE project_id = $1
  AND ($2::text = '' OR kind = $2)
ORDER BY kind ASC, created_at DESC
`

type ListByProjectParams struct {
	ProjectID pgtype.UUID `json:"project_id"`
	Column2   string      `json:"column_2"`
}

type ListByProjectRow struct {
	ID             pgtype.UUID        `json:"id"`
	ProjectID      pgtype.UUID        `json:"project_id"`
	WorkspaceID    pgtype.UUID        `json:"workspace_id"`
	Kind           string             `json:"kind"`
	Title          string             `json:"title"`
	Body           string             `json:"body"`
	Tags           []string           `json:"tags"`
	Source         string             `json:"source"`
	EmbeddingModel *string            `json:"embedding_model"`
	CreatedBy      pgtype.UUID        `json:"created_by"`
	CreatedAt      pgtype.Timestamptz `json:"created_at"`
	UpdatedAt      pgtype.Timestamptz `json:"updated_at"`
}

func (q *Queries) ListByProject(ctx context.Context, arg ListByProjectParams) ([]ListByProjectRow, error) {
	rows, err := q.db.Query(ctx, listByProject, arg.ProjectID, arg.Column2)
	if err != nil {
		return nil, err
	}
	defer rows.Close()
	var items []ListByProjectRow
	for rows.Next() {
		var i ListByProjectRow
		if err := rows.Scan(
			&i.ID,
			&i.ProjectID,
			&i.WorkspaceID,
			&i.Kind,
			&i.Title,
			&i.Body,
			&i.Tags,
			&i.Source,
			&i.EmbeddingModel,
			&i.CreatedBy,
			&i.CreatedAt,
			&i.UpdatedAt,
		); err != nil {
			return nil, err
		}
		items = append(items, i)
	}
	if err := rows.Err(); err != nil {
		return nil, err
	}
	return items, nil
}

const searchByKeyword = `-- name: SearchByKeyword :many
SELECT id, project_id, workspace_id, kind, title, body, tags, source,
       embedding_model, created_by, created_at, updated_at
FROM project_memory
WHERE project_id = $1
  AND ($2::text = '' OR kind = $2)
  AND ($3::text = '' OR title ILIKE '%' || $3 || '%' OR body ILIKE '%' || $3 || '%' OR $3 = ANY(tags))
ORDER BY updated_at DESC
LIMIT $4
`

type SearchByKeywordParams struct {
	ProjectID pgtype.UUID `json:"project_id"`
	Column2   string      `json:"column_2"`
	Column3   string      `json:"column_3"`
	Limit     int32       `json:"limit"`
}

type SearchByKeywordRow struct {
	ID             pgtype.UUID        `json:"id"`
	ProjectID      pgtype.UUID        `json:"project_id"`
	WorkspaceID    pgtype.UUID        `json:"workspace_id"`
	Kind           string             `json:"kind"`
	Title          string             `json:"title"`
	Body           string             `json:"body"`
	Tags           []string           `json:"tags"`
	Source         string             `json:"source"`
	EmbeddingModel *string            `json:"embedding_model"`
	CreatedBy      pgtype.UUID        `json:"created_by"`
	CreatedAt      pgtype.Timestamptz `json:"created_at"`
	UpdatedAt      pgtype.Timestamptz `json:"updated_at"`
}

func (q *Queries) SearchByKeyword(ctx context.Context, arg SearchByKeywordParams) ([]SearchByKeywordRow, error) {
	rows, err := q.db.Query(ctx, searchByKeyword,
		arg.ProjectID,
		arg.Column2,
		arg.Column3,
		arg.Limit,
	)
	if err != nil {
		return nil, err
	}
	defer rows.Close()
	var items []SearchByKeywordRow
	for rows.Next() {
		var i SearchByKeywordRow
		if err := rows.Scan(
			&i.ID,
			&i.ProjectID,
			&i.WorkspaceID,
			&i.Kind,
			&i.Title,
			&i.Body,
			&i.Tags,
			&i.Source,
			&i.EmbeddingModel,
			&i.CreatedBy,
			&i.CreatedAt,
			&i.UpdatedAt,
		); err != nil {
			return nil, err
		}
		items = append(items, i)
	}
	if err := rows.Err(); err != nil {
		return nil, err
	}
	return items, nil
}
