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

package db

import (
	"context"

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

const createWorkspace = `-- name: CreateWorkspace :one
INSERT INTO workspace (name, slug, description, context, issue_prefix)
VALUES ($1, $2, $3, $4, $5)
RETURNING id, name, slug, description, settings, created_at, updated_at, context, repos, issue_prefix, issue_counter, avatar_url
`

type CreateWorkspaceParams struct {
	Name        string      `json:"name"`
	Slug        string      `json:"slug"`
	Description pgtype.Text `json:"description"`
	Context     pgtype.Text `json:"context"`
	IssuePrefix string      `json:"issue_prefix"`
}

func (q *Queries) CreateWorkspace(ctx context.Context, arg CreateWorkspaceParams) (Workspace, error) {
	row := q.db.QueryRow(ctx, createWorkspace,
		arg.Name,
		arg.Slug,
		arg.Description,
		arg.Context,
		arg.IssuePrefix,
	)
	var i Workspace
	err := row.Scan(
		&i.ID,
		&i.Name,
		&i.Slug,
		&i.Description,
		&i.Settings,
		&i.CreatedAt,
		&i.UpdatedAt,
		&i.Context,
		&i.Repos,
		&i.IssuePrefix,
		&i.IssueCounter,
		&i.AvatarUrl,
	)
	return i, err
}

const deleteWorkspace = `-- name: DeleteWorkspace :exec
DELETE FROM workspace WHERE id = $1
`

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

const getWorkspace = `-- name: GetWorkspace :one
SELECT id, name, slug, description, settings, created_at, updated_at, context, repos, issue_prefix, issue_counter, avatar_url FROM workspace
WHERE id = $1
`

func (q *Queries) GetWorkspace(ctx context.Context, id pgtype.UUID) (Workspace, error) {
	row := q.db.QueryRow(ctx, getWorkspace, id)
	var i Workspace
	err := row.Scan(
		&i.ID,
		&i.Name,
		&i.Slug,
		&i.Description,
		&i.Settings,
		&i.CreatedAt,
		&i.UpdatedAt,
		&i.Context,
		&i.Repos,
		&i.IssuePrefix,
		&i.IssueCounter,
		&i.AvatarUrl,
	)
	return i, err
}

const getWorkspaceBySlug = `-- name: GetWorkspaceBySlug :one
SELECT id, name, slug, description, settings, created_at, updated_at, context, repos, issue_prefix, issue_counter, avatar_url FROM workspace
WHERE slug = $1
`

func (q *Queries) GetWorkspaceBySlug(ctx context.Context, slug string) (Workspace, error) {
	row := q.db.QueryRow(ctx, getWorkspaceBySlug, slug)
	var i Workspace
	err := row.Scan(
		&i.ID,
		&i.Name,
		&i.Slug,
		&i.Description,
		&i.Settings,
		&i.CreatedAt,
		&i.UpdatedAt,
		&i.Context,
		&i.Repos,
		&i.IssuePrefix,
		&i.IssueCounter,
		&i.AvatarUrl,
	)
	return i, err
}

const incrementIssueCounter = `-- name: IncrementIssueCounter :one
UPDATE workspace SET issue_counter = issue_counter + 1
WHERE id = $1
RETURNING issue_counter
`

func (q *Queries) IncrementIssueCounter(ctx context.Context, id pgtype.UUID) (int32, error) {
	row := q.db.QueryRow(ctx, incrementIssueCounter, id)
	var issue_counter int32
	err := row.Scan(&issue_counter)
	return issue_counter, err
}

const listWorkspaces = `-- name: ListWorkspaces :many
SELECT w.id, w.name, w.slug, w.description, w.settings,
       w.created_at, w.updated_at, w.context, w.repos,
       w.issue_prefix, w.issue_counter, w.avatar_url
FROM member m
JOIN workspace w ON w.id = m.workspace_id
WHERE m.user_id = $1
ORDER BY w.created_at ASC
`

func (q *Queries) ListWorkspaces(ctx context.Context, userID pgtype.UUID) ([]Workspace, error) {
	rows, err := q.db.Query(ctx, listWorkspaces, userID)
	if err != nil {
		return nil, err
	}
	defer rows.Close()
	items := []Workspace{}
	for rows.Next() {
		var i Workspace
		if err := rows.Scan(
			&i.ID,
			&i.Name,
			&i.Slug,
			&i.Description,
			&i.Settings,
			&i.CreatedAt,
			&i.UpdatedAt,
			&i.Context,
			&i.Repos,
			&i.IssuePrefix,
			&i.IssueCounter,
			&i.AvatarUrl,
		); err != nil {
			return nil, err
		}
		items = append(items, i)
	}
	if err := rows.Err(); err != nil {
		return nil, err
	}
	return items, nil
}

const updateWorkspace = `-- name: UpdateWorkspace :one
UPDATE workspace SET
    name = COALESCE($2, name),
    description = COALESCE($3, description),
    context = COALESCE($4, context),
    settings = COALESCE($5, settings),
    repos = COALESCE($6, repos),
    issue_prefix = COALESCE($7, issue_prefix),
    avatar_url = COALESCE($8, avatar_url),
    updated_at = now()
WHERE id = $1
RETURNING id, name, slug, description, settings, created_at, updated_at, context, repos, issue_prefix, issue_counter, avatar_url
`

type UpdateWorkspaceParams struct {
	ID          pgtype.UUID `json:"id"`
	Name        pgtype.Text `json:"name"`
	Description pgtype.Text `json:"description"`
	Context     pgtype.Text `json:"context"`
	Settings    []byte      `json:"settings"`
	Repos       []byte      `json:"repos"`
	IssuePrefix pgtype.Text `json:"issue_prefix"`
	AvatarUrl   pgtype.Text `json:"avatar_url"`
}

func (q *Queries) UpdateWorkspace(ctx context.Context, arg UpdateWorkspaceParams) (Workspace, error) {
	row := q.db.QueryRow(ctx, updateWorkspace,
		arg.ID,
		arg.Name,
		arg.Description,
		arg.Context,
		arg.Settings,
		arg.Repos,
		arg.IssuePrefix,
		arg.AvatarUrl,
	)
	var i Workspace
	err := row.Scan(
		&i.ID,
		&i.Name,
		&i.Slug,
		&i.Description,
		&i.Settings,
		&i.CreatedAt,
		&i.UpdatedAt,
		&i.Context,
		&i.Repos,
		&i.IssuePrefix,
		&i.IssueCounter,
		&i.AvatarUrl,
	)
	return i, err
}
