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

package database

import (
	"context"
	"time"

	"github.com/google/uuid"
)

const createFollow = `-- name: CreateFollow :one
WITH inserted_follow as (
  INSERT INTO follows (id, created_at, updated_at, feed_id, user_id)
  VALUES (
    $1,
    $2,
    $3,
    $4,
    $5
  )
  RETURNING id, created_at, updated_at, user_id, feed_id
)
SELECT inserted_follow.id, inserted_follow.created_at, inserted_follow.updated_at, inserted_follow.user_id, inserted_follow.feed_id,
  feeds.name as feed_name,
  users.name as user_name
FROM inserted_follow
INNER JOIN users
  ON inserted_follow.user_id = users.id
INNER JOIN feeds
  ON inserted_follow.feed_id = feeds.id
`

type CreateFollowParams struct {
	ID        uuid.UUID
	CreatedAt time.Time
	UpdatedAt time.Time
	FeedID    uuid.UUID
	UserID    uuid.UUID
}

type CreateFollowRow struct {
	ID        uuid.UUID
	CreatedAt time.Time
	UpdatedAt time.Time
	UserID    uuid.UUID
	FeedID    uuid.UUID
	FeedName  string
	UserName  string
}

func (q *Queries) CreateFollow(ctx context.Context, arg CreateFollowParams) (CreateFollowRow, error) {
	row := q.db.QueryRowContext(ctx, createFollow,
		arg.ID,
		arg.CreatedAt,
		arg.UpdatedAt,
		arg.FeedID,
		arg.UserID,
	)
	var i CreateFollowRow
	err := row.Scan(
		&i.ID,
		&i.CreatedAt,
		&i.UpdatedAt,
		&i.UserID,
		&i.FeedID,
		&i.FeedName,
		&i.UserName,
	)
	return i, err
}

const deleteFollowForUser = `-- name: DeleteFollowForUser :exec
DELETE FROM follows
WHERE feed_id = $1 AND user_id = $2
`

type DeleteFollowForUserParams struct {
	FeedID uuid.UUID
	UserID uuid.UUID
}

func (q *Queries) DeleteFollowForUser(ctx context.Context, arg DeleteFollowForUserParams) error {
	_, err := q.db.ExecContext(ctx, deleteFollowForUser, arg.FeedID, arg.UserID)
	return err
}

const getFollowsForUser = `-- name: GetFollowsForUser :many
SELECT follows.id, follows.created_at, follows.updated_at, follows.user_id, follows.feed_id, feeds.name as feed_name FROM follows
INNER JOIN feeds
  ON follows.feed_id = feeds.id
WHERE follows.user_id = $1
`

type GetFollowsForUserRow struct {
	ID        uuid.UUID
	CreatedAt time.Time
	UpdatedAt time.Time
	UserID    uuid.UUID
	FeedID    uuid.UUID
	FeedName  string
}

func (q *Queries) GetFollowsForUser(ctx context.Context, userID uuid.UUID) ([]GetFollowsForUserRow, error) {
	rows, err := q.db.QueryContext(ctx, getFollowsForUser, userID)
	if err != nil {
		return nil, err
	}
	defer rows.Close()
	var items []GetFollowsForUserRow
	for rows.Next() {
		var i GetFollowsForUserRow
		if err := rows.Scan(
			&i.ID,
			&i.CreatedAt,
			&i.UpdatedAt,
			&i.UserID,
			&i.FeedID,
			&i.FeedName,
		); err != nil {
			return nil, err
		}
		items = append(items, i)
	}
	if err := rows.Close(); err != nil {
		return nil, err
	}
	if err := rows.Err(); err != nil {
		return nil, err
	}
	return items, nil
}
