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

package db

import (
	"context"
	"database/sql"
	"time"
)

const createBooking = `-- name: CreateBooking :one
INSERT INTO bookings (user_id, service_id, event_date, address, notes, status)
VALUES ($1, $2, $3, $4, $5, $6)
RETURNING id, user_id, service_id, event_date,  address, notes, created_at, status
`

type CreateBookingParams struct {
	UserID    sql.NullInt64  `json:"user_id"`
	ServiceID sql.NullInt64  `json:"service_id"`
	EventDate time.Time      `json:"event_date"`
	Address   sql.NullString `json:"address"`
	Notes     sql.NullString `json:"notes"`
	Status    sql.NullString `json:"status"`
}

type CreateBookingRow struct {
	ID        int64          `json:"id"`
	UserID    sql.NullInt64  `json:"user_id"`
	ServiceID sql.NullInt64  `json:"service_id"`
	EventDate time.Time      `json:"event_date"`
	Address   sql.NullString `json:"address"`
	Notes     sql.NullString `json:"notes"`
	CreatedAt sql.NullTime   `json:"created_at"`
	Status    sql.NullString `json:"status"`
}

func (q *Queries) CreateBooking(ctx context.Context, arg CreateBookingParams) (CreateBookingRow, error) {
	row := q.db.QueryRowContext(ctx, createBooking,
		arg.UserID,
		arg.ServiceID,
		arg.EventDate,
		arg.Address,
		arg.Notes,
		arg.Status,
	)
	var i CreateBookingRow
	err := row.Scan(
		&i.ID,
		&i.UserID,
		&i.ServiceID,
		&i.EventDate,
		&i.Address,
		&i.Notes,
		&i.CreatedAt,
		&i.Status,
	)
	return i, err
}

const getBooking = `-- name: GetBooking :one
SELECT id, user_id, service_id, event_date, address, notes, created_at, status
FROM bookings
WHERE id = $1
`

type GetBookingRow struct {
	ID        int64          `json:"id"`
	UserID    sql.NullInt64  `json:"user_id"`
	ServiceID sql.NullInt64  `json:"service_id"`
	EventDate time.Time      `json:"event_date"`
	Address   sql.NullString `json:"address"`
	Notes     sql.NullString `json:"notes"`
	CreatedAt sql.NullTime   `json:"created_at"`
	Status    sql.NullString `json:"status"`
}

func (q *Queries) GetBooking(ctx context.Context, id int64) (GetBookingRow, error) {
	row := q.db.QueryRowContext(ctx, getBooking, id)
	var i GetBookingRow
	err := row.Scan(
		&i.ID,
		&i.UserID,
		&i.ServiceID,
		&i.EventDate,
		&i.Address,
		&i.Notes,
		&i.CreatedAt,
		&i.Status,
	)
	return i, err
}

const listBookingsByUser = `-- name: ListBookingsByUser :many
SELECT id, user_id, service_id, event_date, address, notes, created_at, status
FROM bookings
WHERE user_id = $1
ORDER BY event_date DESC
`

type ListBookingsByUserRow struct {
	ID        int64          `json:"id"`
	UserID    sql.NullInt64  `json:"user_id"`
	ServiceID sql.NullInt64  `json:"service_id"`
	EventDate time.Time      `json:"event_date"`
	Address   sql.NullString `json:"address"`
	Notes     sql.NullString `json:"notes"`
	CreatedAt sql.NullTime   `json:"created_at"`
	Status    sql.NullString `json:"status"`
}

func (q *Queries) ListBookingsByUser(ctx context.Context, userID sql.NullInt64) ([]ListBookingsByUserRow, error) {
	rows, err := q.db.QueryContext(ctx, listBookingsByUser, userID)
	if err != nil {
		return nil, err
	}
	defer rows.Close()
	items := []ListBookingsByUserRow{}
	for rows.Next() {
		var i ListBookingsByUserRow
		if err := rows.Scan(
			&i.ID,
			&i.UserID,
			&i.ServiceID,
			&i.EventDate,
			&i.Address,
			&i.Notes,
			&i.CreatedAt,
			&i.Status,
		); 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 listBookingsWithServiceByUser = `-- name: ListBookingsWithServiceByUser :many
SELECT 
    b.id,
    b.user_id,
    b.service_id,
    b.event_date,
    b.address,
    b.notes,
    b.created_at,
    b.status,
    s.name as service_name,
    s.description as service_description,
    s.price_cents as service_price_cents
FROM bookings b
JOIN services s ON b.service_id = s.id
WHERE b.user_id = $1
ORDER BY b.event_date DESC
`

type ListBookingsWithServiceByUserRow struct {
	ID                 int64          `json:"id"`
	UserID             sql.NullInt64  `json:"user_id"`
	ServiceID          sql.NullInt64  `json:"service_id"`
	EventDate          time.Time      `json:"event_date"`
	Address            sql.NullString `json:"address"`
	Notes              sql.NullString `json:"notes"`
	CreatedAt          sql.NullTime   `json:"created_at"`
	Status             sql.NullString `json:"status"`
	ServiceName        string         `json:"service_name"`
	ServiceDescription sql.NullString `json:"service_description"`
	ServicePriceCents  int32          `json:"service_price_cents"`
}

func (q *Queries) ListBookingsWithServiceByUser(ctx context.Context, userID sql.NullInt64) ([]ListBookingsWithServiceByUserRow, error) {
	rows, err := q.db.QueryContext(ctx, listBookingsWithServiceByUser, userID)
	if err != nil {
		return nil, err
	}
	defer rows.Close()
	items := []ListBookingsWithServiceByUserRow{}
	for rows.Next() {
		var i ListBookingsWithServiceByUserRow
		if err := rows.Scan(
			&i.ID,
			&i.UserID,
			&i.ServiceID,
			&i.EventDate,
			&i.Address,
			&i.Notes,
			&i.CreatedAt,
			&i.Status,
			&i.ServiceName,
			&i.ServiceDescription,
			&i.ServicePriceCents,
		); 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
}
