-- name: GetTransaction :one
SELECT * FROM display_transactions
WHERE id = $1;

-- name: CreateTransaction :one
INSERT INTO transactions
(date, memo, amount, account_id, payee_id, category_id, group_id, status)
VALUES ($1, $2, $3, $4, $5, $6, $7, $8)
RETURNING id;

-- name: UpdateTransaction :exec
UPDATE transactions
SET date = $1,
    memo = $2,
    amount = $3,
    payee_id = $4,
    category_id = $5
WHERE id = $6;

-- name: SetTransactionReconciled :exec
UPDATE transactions
SET status = 'Reconciled'
WHERE id = $1;

-- name: DeleteTransaction :exec
DELETE FROM transactions
WHERE id = $1;

-- name: GetAllTransactionsForBudget :many
SELECT  t.*
FROM display_transactions AS t
WHERE t.budget_id = $1;

-- name: GetTransactionsForAccount :many
SELECT  t.*
FROM display_transactions AS t
WHERE t.account_id = $1;

-- name: DeleteAllTransactions :execrows
DELETE FROM transactions
USING accounts
WHERE accounts.budget_id = @budget_id
AND accounts.id = transactions.account_id;

-- name: GetTransactionsByMonthAndCategory :many
SELECT *
FROM transactions_by_month
WHERE transactions_by_month.budget_id = @budget_id;

-- name: GetProblematicTransactions :many
SELECT transactions.*
FROM display_transactions AS transactions
LEFT JOIN accounts 
        ON transactions.account_id = accounts.id
LEFT JOIN transactions AS otherGroupTransaction 
        ON transactions.group_id = otherGroupTransaction.group_id 
        AND transactions.id != otherGroupTransaction.id 
        AND transactions.account_id != otherGroupTransaction.account_id
LEFT JOIn accounts AS otherGroupAccount 
        ON otherGroupTransaction.account_id = otherGroupAccount.id
WHERE transactions.category_id IS NULL
AND accounts.on_budget
AND (otherGroupAccount.id IS NULL OR NOT otherGroupAccount.on_budget)
AND accounts.budget_id = $1;