// Code generated by sqlc. DO NOT EDIT.
// versions:
//   sqlc v1.21.0
// source: mail.sql

package db

import (
	"context"
	"time"

	"github.com/lib/pq"
)

const createMail = `-- name: CreateMail :one
INSERT INTO mails (
    "from",
    "to",
    cc,
    "subject",
    body,
    "timestamp",
    creator,
    changer
) 
VALUES (
    $1, $2, $3, $4, $5, $6, $7, $8
) 
RETURNING "ID", "from", "to", cc, timestamp, subject, body, creator, created, changer, changed
`

type CreateMailParams struct {
	From      string    `json:"from"`
	To        []string  `json:"to"`
	Cc        []string  `json:"cc"`
	Subject   string    `json:"subject"`
	Body      string    `json:"body"`
	Timestamp time.Time `json:"timestamp"`
	Creator   string    `json:"creator"`
	Changer   string    `json:"changer"`
}

func (q *Queries) CreateMail(ctx context.Context, arg CreateMailParams) (Mail, error) {
	row := q.db.QueryRowContext(ctx, createMail,
		arg.From,
		pq.Array(arg.To),
		pq.Array(arg.Cc),
		arg.Subject,
		arg.Body,
		arg.Timestamp,
		arg.Creator,
		arg.Changer,
	)
	var i Mail
	err := row.Scan(
		&i.ID,
		&i.From,
		pq.Array(&i.To),
		pq.Array(&i.Cc),
		&i.Timestamp,
		&i.Subject,
		&i.Body,
		&i.Creator,
		&i.Created,
		&i.Changer,
		&i.Changed,
	)
	return i, err
}

const deleteMail = `-- name: DeleteMail :exec

DELETE FROM mails
WHERE "ID" = $1
`

// -- name: UpdateMail :one
// UPDATE mails
// SET
//
//	"from" = COALESCE(sqlc.narg(from), "from"),
//	"to" = COALESCE(sqlc.narg(to), "to"),
//	cc = COALESCE(sqlc.narg(cc), cc),
//	"subject" = COALESCE(sqlc.narg(subject), "subject"),
//	body = COALESCE(sqlc.narg(body), body),
//	"timestamp" = COALESCE(sqlc.narg(timestamp), "timestamp"),
//	changer = $2,
//	changed = now()
//
// WHERE "ID" = $1
// RETURNING *;
func (q *Queries) DeleteMail(ctx context.Context, id int64) error {
	_, err := q.db.ExecContext(ctx, deleteMail, id)
	return err
}

const getMail = `-- name: GetMail :one
SELECT "ID", "from", "to", cc, timestamp, subject, body, creator, created, changer, changed FROM mails
WHERE "ID" = $1 LIMIT 1
`

func (q *Queries) GetMail(ctx context.Context, id int64) (Mail, error) {
	row := q.db.QueryRowContext(ctx, getMail, id)
	var i Mail
	err := row.Scan(
		&i.ID,
		&i.From,
		pq.Array(&i.To),
		pq.Array(&i.Cc),
		&i.Timestamp,
		&i.Subject,
		&i.Body,
		&i.Creator,
		&i.Created,
		&i.Changer,
		&i.Changed,
	)
	return i, err
}

const listMails = `-- name: ListMails :many
SELECT "ID", "from", "to", cc, timestamp, subject, body, creator, created, changer, changed FROM mails
ORDER BY "timestamp", "from"
LIMIT $1
OFFSET $2
`

type ListMailsParams struct {
	Limit  int32 `json:"limit"`
	Offset int32 `json:"offset"`
}

func (q *Queries) ListMails(ctx context.Context, arg ListMailsParams) ([]Mail, error) {
	rows, err := q.db.QueryContext(ctx, listMails, arg.Limit, arg.Offset)
	if err != nil {
		return nil, err
	}
	defer rows.Close()
	items := []Mail{}
	for rows.Next() {
		var i Mail
		if err := rows.Scan(
			&i.ID,
			&i.From,
			pq.Array(&i.To),
			pq.Array(&i.Cc),
			&i.Timestamp,
			&i.Subject,
			&i.Body,
			&i.Creator,
			&i.Created,
			&i.Changer,
			&i.Changed,
		); 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
}