// Code generated by sqlc. DO NOT EDIT.
// source: notification.sql

package db

import (
	"context"
	"time"

	"github.com/google/uuid"
)

const createNotification = `-- name: CreateNotification :one
INSERT INTO notification(notification_object_id, notifier_id)
  VALUES ($1, $2) RETURNING notification_id, notification_object_id, notifier_id, read
`

type CreateNotificationParams struct {
	NotificationObjectID uuid.UUID `json:"notification_object_id"`
	NotifierID           uuid.UUID `json:"notifier_id"`
}

func (q *Queries) CreateNotification(ctx context.Context, arg CreateNotificationParams) (Notification, error) {
	row := q.db.QueryRowContext(ctx, createNotification, arg.NotificationObjectID, arg.NotifierID)
	var i Notification
	err := row.Scan(
		&i.NotificationID,
		&i.NotificationObjectID,
		&i.NotifierID,
		&i.Read,
	)
	return i, err
}

const createNotificationObject = `-- name: CreateNotificationObject :one
INSERT INTO notification_object(entity_type, action_type, entity_id, created_on, actor_id)
  VALUES ($1, $2, $3, $4, $5) RETURNING notification_object_id, entity_id, action_type, actor_id, entity_type, created_on
`

type CreateNotificationObjectParams struct {
	EntityType int32     `json:"entity_type"`
	ActionType int32     `json:"action_type"`
	EntityID   uuid.UUID `json:"entity_id"`
	CreatedOn  time.Time `json:"created_on"`
	ActorID    uuid.UUID `json:"actor_id"`
}

func (q *Queries) CreateNotificationObject(ctx context.Context, arg CreateNotificationObjectParams) (NotificationObject, error) {
	row := q.db.QueryRowContext(ctx, createNotificationObject,
		arg.EntityType,
		arg.ActionType,
		arg.EntityID,
		arg.CreatedOn,
		arg.ActorID,
	)
	var i NotificationObject
	err := row.Scan(
		&i.NotificationObjectID,
		&i.EntityID,
		&i.ActionType,
		&i.ActorID,
		&i.EntityType,
		&i.CreatedOn,
	)
	return i, err
}

const getAllNotificationsForUserID = `-- name: GetAllNotificationsForUserID :many
SELECT n.notification_id, n.notification_object_id, n.notifier_id, n.read FROM notification as n
INNER JOIN notification_object as no ON no.notification_object_id = n.notification_object_id
WHERE n.notifier_id = $1 ORDER BY no.created_on DESC
`

func (q *Queries) GetAllNotificationsForUserID(ctx context.Context, notifierID uuid.UUID) ([]Notification, error) {
	rows, err := q.db.QueryContext(ctx, getAllNotificationsForUserID, notifierID)
	if err != nil {
		return nil, err
	}
	defer rows.Close()
	var items []Notification
	for rows.Next() {
		var i Notification
		if err := rows.Scan(
			&i.NotificationID,
			&i.NotificationObjectID,
			&i.NotifierID,
			&i.Read,
		); 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
}

const getEntityForNotificationID = `-- name: GetEntityForNotificationID :one
SELECT no.created_on, no.entity_id, no.entity_type, no.action_type, no.actor_id FROM notification as n
  INNER JOIN notification_object as no ON no.notification_object_id = n.notification_object_id
WHERE n.notification_id = $1
`

type GetEntityForNotificationIDRow struct {
	CreatedOn  time.Time `json:"created_on"`
	EntityID   uuid.UUID `json:"entity_id"`
	EntityType int32     `json:"entity_type"`
	ActionType int32     `json:"action_type"`
	ActorID    uuid.UUID `json:"actor_id"`
}

func (q *Queries) GetEntityForNotificationID(ctx context.Context, notificationID uuid.UUID) (GetEntityForNotificationIDRow, error) {
	row := q.db.QueryRowContext(ctx, getEntityForNotificationID, notificationID)
	var i GetEntityForNotificationIDRow
	err := row.Scan(
		&i.CreatedOn,
		&i.EntityID,
		&i.EntityType,
		&i.ActionType,
		&i.ActorID,
	)
	return i, err
}

const getEntityIDForNotificationID = `-- name: GetEntityIDForNotificationID :one
SELECT no.entity_id FROM notification as n
  INNER JOIN notification_object as no ON no.notification_object_id = n.notification_object_id
WHERE n.notification_id = $1
`

func (q *Queries) GetEntityIDForNotificationID(ctx context.Context, notificationID uuid.UUID) (uuid.UUID, error) {
	row := q.db.QueryRowContext(ctx, getEntityIDForNotificationID, notificationID)
	var entity_id uuid.UUID
	err := row.Scan(&entity_id)
	return entity_id, err
}

const getNotificationForNotificationID = `-- name: GetNotificationForNotificationID :one
SELECT n.notification_id, n.notification_object_id, n.notifier_id, n.read, no.notification_object_id, no.entity_id, no.action_type, no.actor_id, no.entity_type, no.created_on FROM notification as n
  INNER JOIN notification_object as no ON no.notification_object_id = n.notification_object_id
WHERE n.notification_id = $1
`

type GetNotificationForNotificationIDRow struct {
	NotificationID         uuid.UUID `json:"notification_id"`
	NotificationObjectID   uuid.UUID `json:"notification_object_id"`
	NotifierID             uuid.UUID `json:"notifier_id"`
	Read                   bool      `json:"read"`
	NotificationObjectID_2 uuid.UUID `json:"notification_object_id_2"`
	EntityID               uuid.UUID `json:"entity_id"`
	ActionType             int32     `json:"action_type"`
	ActorID                uuid.UUID `json:"actor_id"`
	EntityType             int32     `json:"entity_type"`
	CreatedOn              time.Time `json:"created_on"`
}

func (q *Queries) GetNotificationForNotificationID(ctx context.Context, notificationID uuid.UUID) (GetNotificationForNotificationIDRow, error) {
	row := q.db.QueryRowContext(ctx, getNotificationForNotificationID, notificationID)
	var i GetNotificationForNotificationIDRow
	err := row.Scan(
		&i.NotificationID,
		&i.NotificationObjectID,
		&i.NotifierID,
		&i.Read,
		&i.NotificationObjectID_2,
		&i.EntityID,
		&i.ActionType,
		&i.ActorID,
		&i.EntityType,
		&i.CreatedOn,
	)
	return i, err
}
