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

package db

import (
	"context"

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

const createVerificationCode = `-- name: CreateVerificationCode :one
INSERT INTO verification_code (email, code, expires_at)
VALUES ($1, $2, $3)
RETURNING id, email, code, expires_at, used, created_at, attempts
`

type CreateVerificationCodeParams struct {
	Email     string             `json:"email"`
	Code      string             `json:"code"`
	ExpiresAt pgtype.Timestamptz `json:"expires_at"`
}

func (q *Queries) CreateVerificationCode(ctx context.Context, arg CreateVerificationCodeParams) (VerificationCode, error) {
	row := q.db.QueryRow(ctx, createVerificationCode, arg.Email, arg.Code, arg.ExpiresAt)
	var i VerificationCode
	err := row.Scan(
		&i.ID,
		&i.Email,
		&i.Code,
		&i.ExpiresAt,
		&i.Used,
		&i.CreatedAt,
		&i.Attempts,
	)
	return i, err
}

const deleteExpiredVerificationCodes = `-- name: DeleteExpiredVerificationCodes :exec
DELETE FROM verification_code
WHERE expires_at < now() - interval '1 hour'
`

func (q *Queries) DeleteExpiredVerificationCodes(ctx context.Context) error {
	_, err := q.db.Exec(ctx, deleteExpiredVerificationCodes)
	return err
}

const getLatestCodeByEmail = `-- name: GetLatestCodeByEmail :one
SELECT id, email, code, expires_at, used, created_at, attempts FROM verification_code
WHERE email = $1
ORDER BY created_at DESC
LIMIT 1
`

func (q *Queries) GetLatestCodeByEmail(ctx context.Context, email string) (VerificationCode, error) {
	row := q.db.QueryRow(ctx, getLatestCodeByEmail, email)
	var i VerificationCode
	err := row.Scan(
		&i.ID,
		&i.Email,
		&i.Code,
		&i.ExpiresAt,
		&i.Used,
		&i.CreatedAt,
		&i.Attempts,
	)
	return i, err
}

const getLatestVerificationCode = `-- name: GetLatestVerificationCode :one
SELECT id, email, code, expires_at, used, created_at, attempts FROM verification_code
WHERE email = $1
  AND used = FALSE
  AND expires_at > now()
  AND attempts < 5
ORDER BY created_at DESC
LIMIT 1
`

func (q *Queries) GetLatestVerificationCode(ctx context.Context, email string) (VerificationCode, error) {
	row := q.db.QueryRow(ctx, getLatestVerificationCode, email)
	var i VerificationCode
	err := row.Scan(
		&i.ID,
		&i.Email,
		&i.Code,
		&i.ExpiresAt,
		&i.Used,
		&i.CreatedAt,
		&i.Attempts,
	)
	return i, err
}

const incrementVerificationCodeAttempts = `-- name: IncrementVerificationCodeAttempts :exec
UPDATE verification_code
SET attempts = attempts + 1
WHERE id = $1
`

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

const markVerificationCodeUsed = `-- name: MarkVerificationCodeUsed :exec
UPDATE verification_code
SET used = TRUE
WHERE id = $1
`

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