// Code generated by sqlc. DO NOT EDIT.
// versions:
//   sqlc v1.30.0
// source: containers.sql

package sqlc

import (
	"context"

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

const deleteContainerByBotID = `-- name: DeleteContainerByBotID :exec
DELETE FROM containers WHERE bot_id = $1
`

func (q *Queries) DeleteContainerByBotID(ctx context.Context, botID pgtype.UUID) error {
	_, err := q.db.Exec(ctx, deleteContainerByBotID, botID)
	return err
}

const getContainerByBotID = `-- name: GetContainerByBotID :one
SELECT id, bot_id, container_id, container_name, image, status, namespace, auto_start, host_path, container_path, created_at, updated_at, last_started_at, last_stopped_at FROM containers WHERE bot_id = $1 ORDER BY updated_at DESC LIMIT 1
`

func (q *Queries) GetContainerByBotID(ctx context.Context, botID pgtype.UUID) (Container, error) {
	row := q.db.QueryRow(ctx, getContainerByBotID, botID)
	var i Container
	err := row.Scan(
		&i.ID,
		&i.BotID,
		&i.ContainerID,
		&i.ContainerName,
		&i.Image,
		&i.Status,
		&i.Namespace,
		&i.AutoStart,
		&i.HostPath,
		&i.ContainerPath,
		&i.CreatedAt,
		&i.UpdatedAt,
		&i.LastStartedAt,
		&i.LastStoppedAt,
	)
	return i, err
}

const listAutoStartContainers = `-- name: ListAutoStartContainers :many
SELECT id, bot_id, container_id, container_name, image, status, namespace, auto_start, host_path, container_path, created_at, updated_at, last_started_at, last_stopped_at FROM containers WHERE auto_start = true ORDER BY updated_at DESC
`

func (q *Queries) ListAutoStartContainers(ctx context.Context) ([]Container, error) {
	rows, err := q.db.Query(ctx, listAutoStartContainers)
	if err != nil {
		return nil, err
	}
	defer rows.Close()
	var items []Container
	for rows.Next() {
		var i Container
		if err := rows.Scan(
			&i.ID,
			&i.BotID,
			&i.ContainerID,
			&i.ContainerName,
			&i.Image,
			&i.Status,
			&i.Namespace,
			&i.AutoStart,
			&i.HostPath,
			&i.ContainerPath,
			&i.CreatedAt,
			&i.UpdatedAt,
			&i.LastStartedAt,
			&i.LastStoppedAt,
		); err != nil {
			return nil, err
		}
		items = append(items, i)
	}
	if err := rows.Err(); err != nil {
		return nil, err
	}
	return items, nil
}

const updateContainerStarted = `-- name: UpdateContainerStarted :exec
UPDATE containers
SET status = 'running', last_started_at = now(), updated_at = now()
WHERE bot_id = $1
`

func (q *Queries) UpdateContainerStarted(ctx context.Context, botID pgtype.UUID) error {
	_, err := q.db.Exec(ctx, updateContainerStarted, botID)
	return err
}

const updateContainerStatus = `-- name: UpdateContainerStatus :exec
UPDATE containers
SET status = $1, updated_at = now()
WHERE bot_id = $2
`

type UpdateContainerStatusParams struct {
	Status string      `json:"status"`
	BotID  pgtype.UUID `json:"bot_id"`
}

func (q *Queries) UpdateContainerStatus(ctx context.Context, arg UpdateContainerStatusParams) error {
	_, err := q.db.Exec(ctx, updateContainerStatus, arg.Status, arg.BotID)
	return err
}

const updateContainerStopped = `-- name: UpdateContainerStopped :exec
UPDATE containers
SET status = 'stopped', last_stopped_at = now(), updated_at = now()
WHERE bot_id = $1
`

func (q *Queries) UpdateContainerStopped(ctx context.Context, botID pgtype.UUID) error {
	_, err := q.db.Exec(ctx, updateContainerStopped, botID)
	return err
}

const upsertContainer = `-- name: UpsertContainer :exec
INSERT INTO containers (
  bot_id, container_id, container_name, image, status, namespace, auto_start,
  host_path, container_path, last_started_at, last_stopped_at
)
VALUES (
  $1,
  $2,
  $3,
  $4,
  $5,
  $6,
  $7,
  $8,
  $9,
  $10,
  $11
)
ON CONFLICT (container_id) DO UPDATE SET
  bot_id = EXCLUDED.bot_id,
  container_name = EXCLUDED.container_name,
  image = EXCLUDED.image,
  status = EXCLUDED.status,
  namespace = EXCLUDED.namespace,
  auto_start = EXCLUDED.auto_start,
  host_path = EXCLUDED.host_path,
  container_path = EXCLUDED.container_path,
  last_started_at = EXCLUDED.last_started_at,
  last_stopped_at = EXCLUDED.last_stopped_at,
  updated_at = now()
`

type UpsertContainerParams struct {
	BotID         pgtype.UUID        `json:"bot_id"`
	ContainerID   string             `json:"container_id"`
	ContainerName string             `json:"container_name"`
	Image         string             `json:"image"`
	Status        string             `json:"status"`
	Namespace     string             `json:"namespace"`
	AutoStart     bool               `json:"auto_start"`
	HostPath      pgtype.Text        `json:"host_path"`
	ContainerPath string             `json:"container_path"`
	LastStartedAt pgtype.Timestamptz `json:"last_started_at"`
	LastStoppedAt pgtype.Timestamptz `json:"last_stopped_at"`
}

func (q *Queries) UpsertContainer(ctx context.Context, arg UpsertContainerParams) error {
	_, err := q.db.Exec(ctx, upsertContainer,
		arg.BotID,
		arg.ContainerID,
		arg.ContainerName,
		arg.Image,
		arg.Status,
		arg.Namespace,
		arg.AutoStart,
		arg.HostPath,
		arg.ContainerPath,
		arg.LastStartedAt,
		arg.LastStoppedAt,
	)
	return err
}
