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

package sqlc

import (
	"context"

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

const deleteBotChannelConfig = `-- name: DeleteBotChannelConfig :exec
DELETE FROM bot_channel_configs
WHERE bot_id = $1 AND channel_type = $2
`

type DeleteBotChannelConfigParams struct {
	BotID       pgtype.UUID `json:"bot_id"`
	ChannelType string      `json:"channel_type"`
}

func (q *Queries) DeleteBotChannelConfig(ctx context.Context, arg DeleteBotChannelConfigParams) error {
	_, err := q.db.Exec(ctx, deleteBotChannelConfig, arg.BotID, arg.ChannelType)
	return err
}

const getBotChannelConfig = `-- name: GetBotChannelConfig :one
SELECT id, bot_id, channel_type, credentials, external_identity, self_identity, routing, capabilities, disabled, verified_at, created_at, updated_at
FROM bot_channel_configs
WHERE bot_id = $1 AND channel_type = $2
LIMIT 1
`

type GetBotChannelConfigParams struct {
	BotID       pgtype.UUID `json:"bot_id"`
	ChannelType string      `json:"channel_type"`
}

func (q *Queries) GetBotChannelConfig(ctx context.Context, arg GetBotChannelConfigParams) (BotChannelConfig, error) {
	row := q.db.QueryRow(ctx, getBotChannelConfig, arg.BotID, arg.ChannelType)
	var i BotChannelConfig
	err := row.Scan(
		&i.ID,
		&i.BotID,
		&i.ChannelType,
		&i.Credentials,
		&i.ExternalIdentity,
		&i.SelfIdentity,
		&i.Routing,
		&i.Capabilities,
		&i.Disabled,
		&i.VerifiedAt,
		&i.CreatedAt,
		&i.UpdatedAt,
	)
	return i, err
}

const getBotChannelConfigByExternalIdentity = `-- name: GetBotChannelConfigByExternalIdentity :one
SELECT id, bot_id, channel_type, credentials, external_identity, self_identity, routing, capabilities, disabled, verified_at, created_at, updated_at
FROM bot_channel_configs
WHERE channel_type = $1 AND external_identity = $2
LIMIT 1
`

type GetBotChannelConfigByExternalIdentityParams struct {
	ChannelType      string      `json:"channel_type"`
	ExternalIdentity pgtype.Text `json:"external_identity"`
}

func (q *Queries) GetBotChannelConfigByExternalIdentity(ctx context.Context, arg GetBotChannelConfigByExternalIdentityParams) (BotChannelConfig, error) {
	row := q.db.QueryRow(ctx, getBotChannelConfigByExternalIdentity, arg.ChannelType, arg.ExternalIdentity)
	var i BotChannelConfig
	err := row.Scan(
		&i.ID,
		&i.BotID,
		&i.ChannelType,
		&i.Credentials,
		&i.ExternalIdentity,
		&i.SelfIdentity,
		&i.Routing,
		&i.Capabilities,
		&i.Disabled,
		&i.VerifiedAt,
		&i.CreatedAt,
		&i.UpdatedAt,
	)
	return i, err
}

const getUserChannelBinding = `-- name: GetUserChannelBinding :one
SELECT id, user_id, channel_type, config, created_at, updated_at
FROM user_channel_bindings
WHERE user_id = $1 AND channel_type = $2
LIMIT 1
`

type GetUserChannelBindingParams struct {
	UserID      pgtype.UUID `json:"user_id"`
	ChannelType string      `json:"channel_type"`
}

func (q *Queries) GetUserChannelBinding(ctx context.Context, arg GetUserChannelBindingParams) (UserChannelBinding, error) {
	row := q.db.QueryRow(ctx, getUserChannelBinding, arg.UserID, arg.ChannelType)
	var i UserChannelBinding
	err := row.Scan(
		&i.ID,
		&i.UserID,
		&i.ChannelType,
		&i.Config,
		&i.CreatedAt,
		&i.UpdatedAt,
	)
	return i, err
}

const listBotChannelConfigsByType = `-- name: ListBotChannelConfigsByType :many
SELECT id, bot_id, channel_type, credentials, external_identity, self_identity, routing, capabilities, disabled, verified_at, created_at, updated_at
FROM bot_channel_configs
WHERE channel_type = $1
ORDER BY created_at DESC
`

func (q *Queries) ListBotChannelConfigsByType(ctx context.Context, channelType string) ([]BotChannelConfig, error) {
	rows, err := q.db.Query(ctx, listBotChannelConfigsByType, channelType)
	if err != nil {
		return nil, err
	}
	defer rows.Close()
	var items []BotChannelConfig
	for rows.Next() {
		var i BotChannelConfig
		if err := rows.Scan(
			&i.ID,
			&i.BotID,
			&i.ChannelType,
			&i.Credentials,
			&i.ExternalIdentity,
			&i.SelfIdentity,
			&i.Routing,
			&i.Capabilities,
			&i.Disabled,
			&i.VerifiedAt,
			&i.CreatedAt,
			&i.UpdatedAt,
		); err != nil {
			return nil, err
		}
		items = append(items, i)
	}
	if err := rows.Err(); err != nil {
		return nil, err
	}
	return items, nil
}

const listUserChannelBindingsByPlatform = `-- name: ListUserChannelBindingsByPlatform :many
SELECT id, user_id, channel_type, config, created_at, updated_at
FROM user_channel_bindings
WHERE channel_type = $1
ORDER BY created_at DESC
`

func (q *Queries) ListUserChannelBindingsByPlatform(ctx context.Context, channelType string) ([]UserChannelBinding, error) {
	rows, err := q.db.Query(ctx, listUserChannelBindingsByPlatform, channelType)
	if err != nil {
		return nil, err
	}
	defer rows.Close()
	var items []UserChannelBinding
	for rows.Next() {
		var i UserChannelBinding
		if err := rows.Scan(
			&i.ID,
			&i.UserID,
			&i.ChannelType,
			&i.Config,
			&i.CreatedAt,
			&i.UpdatedAt,
		); err != nil {
			return nil, err
		}
		items = append(items, i)
	}
	if err := rows.Err(); err != nil {
		return nil, err
	}
	return items, nil
}

const updateBotChannelConfigDisabled = `-- name: UpdateBotChannelConfigDisabled :one
UPDATE bot_channel_configs
SET
  disabled = $3,
  updated_at = now()
WHERE bot_id = $1 AND channel_type = $2
RETURNING id, bot_id, channel_type, credentials, external_identity, self_identity, routing, capabilities, disabled, verified_at, created_at, updated_at
`

type UpdateBotChannelConfigDisabledParams struct {
	BotID       pgtype.UUID `json:"bot_id"`
	ChannelType string      `json:"channel_type"`
	Disabled    bool        `json:"disabled"`
}

func (q *Queries) UpdateBotChannelConfigDisabled(ctx context.Context, arg UpdateBotChannelConfigDisabledParams) (BotChannelConfig, error) {
	row := q.db.QueryRow(ctx, updateBotChannelConfigDisabled, arg.BotID, arg.ChannelType, arg.Disabled)
	var i BotChannelConfig
	err := row.Scan(
		&i.ID,
		&i.BotID,
		&i.ChannelType,
		&i.Credentials,
		&i.ExternalIdentity,
		&i.SelfIdentity,
		&i.Routing,
		&i.Capabilities,
		&i.Disabled,
		&i.VerifiedAt,
		&i.CreatedAt,
		&i.UpdatedAt,
	)
	return i, err
}

const upsertBotChannelConfig = `-- name: UpsertBotChannelConfig :one
INSERT INTO bot_channel_configs (
  bot_id, channel_type, credentials, external_identity, self_identity, routing, capabilities, disabled, verified_at
)
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)
ON CONFLICT (bot_id, channel_type)
DO UPDATE SET
  credentials = EXCLUDED.credentials,
  external_identity = EXCLUDED.external_identity,
  self_identity = EXCLUDED.self_identity,
  routing = EXCLUDED.routing,
  capabilities = EXCLUDED.capabilities,
  disabled = EXCLUDED.disabled,
  verified_at = EXCLUDED.verified_at,
  updated_at = now()
RETURNING id, bot_id, channel_type, credentials, external_identity, self_identity, routing, capabilities, disabled, verified_at, created_at, updated_at
`

type UpsertBotChannelConfigParams struct {
	BotID            pgtype.UUID        `json:"bot_id"`
	ChannelType      string             `json:"channel_type"`
	Credentials      []byte             `json:"credentials"`
	ExternalIdentity pgtype.Text        `json:"external_identity"`
	SelfIdentity     []byte             `json:"self_identity"`
	Routing          []byte             `json:"routing"`
	Capabilities     []byte             `json:"capabilities"`
	Disabled         bool               `json:"disabled"`
	VerifiedAt       pgtype.Timestamptz `json:"verified_at"`
}

func (q *Queries) UpsertBotChannelConfig(ctx context.Context, arg UpsertBotChannelConfigParams) (BotChannelConfig, error) {
	row := q.db.QueryRow(ctx, upsertBotChannelConfig,
		arg.BotID,
		arg.ChannelType,
		arg.Credentials,
		arg.ExternalIdentity,
		arg.SelfIdentity,
		arg.Routing,
		arg.Capabilities,
		arg.Disabled,
		arg.VerifiedAt,
	)
	var i BotChannelConfig
	err := row.Scan(
		&i.ID,
		&i.BotID,
		&i.ChannelType,
		&i.Credentials,
		&i.ExternalIdentity,
		&i.SelfIdentity,
		&i.Routing,
		&i.Capabilities,
		&i.Disabled,
		&i.VerifiedAt,
		&i.CreatedAt,
		&i.UpdatedAt,
	)
	return i, err
}

const upsertUserChannelBinding = `-- name: UpsertUserChannelBinding :one
INSERT INTO user_channel_bindings (user_id, channel_type, config)
VALUES ($1, $2, $3)
ON CONFLICT (user_id, channel_type)
DO UPDATE SET
  config = EXCLUDED.config,
  updated_at = now()
RETURNING id, user_id, channel_type, config, created_at, updated_at
`

type UpsertUserChannelBindingParams struct {
	UserID      pgtype.UUID `json:"user_id"`
	ChannelType string      `json:"channel_type"`
	Config      []byte      `json:"config"`
}

func (q *Queries) UpsertUserChannelBinding(ctx context.Context, arg UpsertUserChannelBindingParams) (UserChannelBinding, error) {
	row := q.db.QueryRow(ctx, upsertUserChannelBinding, arg.UserID, arg.ChannelType, arg.Config)
	var i UserChannelBinding
	err := row.Scan(
		&i.ID,
		&i.UserID,
		&i.ChannelType,
		&i.Config,
		&i.CreatedAt,
		&i.UpdatedAt,
	)
	return i, err
}
