-- name: GetTaskWatcher :one
SELECT * FROM task_watcher WHERE user_id = $1 AND task_id = $2;

-- name: CreateTaskWatcher :one
INSERT INTO task_watcher (user_id, task_id, watched_at) VALUES ($1, $2, $3) RETURNING *;

-- name: DeleteTaskWatcher :exec
DELETE FROM task_watcher WHERE user_id = $1 AND task_id = $2;

-- name: CreateTask :one
INSERT INTO task (task_group_id, created_at, name, position)
  VALUES($1, $2, $3, $4) RETURNING *;

-- name: CreateTaskAll :one
INSERT INTO task (task_group_id, created_at, name, position, description, complete, due_date)
  VALUES ($1, $2, $3, $4, $5, $6, $7) RETURNING *;

-- name: UpdateTaskDescription :one
UPDATE task SET description = $2 WHERE task_id = $1 RETURNING *;

-- name: GetTaskByID :one
SELECT * FROM task WHERE task_id = $1;

-- name: GetTasksForTaskGroupID :many
SELECT * FROM task WHERE task_group_id = $1;

-- name: GetAllTasks :many
SELECT * FROM task;

-- name: UpdateTaskLocation :one
UPDATE task SET task_group_id = $2, position = $3 WHERE task_id = $1 RETURNING *;

-- name: UpdateTaskPosition :one
UPDATE task SET position = $2 WHERE task_id = $1 RETURNING *;

-- name: DeleteTaskByID :exec
DELETE FROM task WHERE task_id = $1;

-- name: UpdateTaskName :one
UPDATE task SET name = $2 WHERE task_id = $1 RETURNING *;

-- name: DeleteTasksByTaskGroupID :execrows
DELETE FROM task where task_group_id = $1;

-- name: UpdateTaskDueDate :one
UPDATE task SET due_date = $2, has_time = $3 WHERE task_id = $1 RETURNING *;

-- name: SetTaskComplete :one
UPDATE task SET complete = $2, completed_at = $3 WHERE task_id = $1 RETURNING *;

-- name: GetProjectIDForTask :one
SELECT project_id FROM task
  INNER JOIN task_group ON task_group.task_group_id = task.task_group_id
  WHERE task_id = $1;

-- name: GetProjectInfoForTask :one
SELECT project.project_id, project.name FROM task
  INNER JOIN task_group ON task_group.task_group_id = task.task_group_id
  INNER JOIN project ON task_group.project_id = project.project_id
  WHERE task_id = $1;

-- name: CreateTaskComment :one
INSERT INTO task_comment (task_id, message, created_at, created_by)
  VALUES ($1, $2, $3, $4) RETURNING *;

-- name: GetCommentsForTaskID :many
SELECT * FROM task_comment WHERE task_id = $1 ORDER BY created_at;

-- name: DeleteTaskCommentByID :one
DELETE FROM task_comment WHERE task_comment_id = $1 RETURNING *;

-- name: UpdateTaskComment :one
UPDATE task_comment SET message = $2, updated_at = $3 WHERE task_comment_id = $1 RETURNING *;

-- name: GetRecentlyAssignedTaskForUserID :many
SELECT task.* FROM task_assigned INNER JOIN
  task ON task.task_id = task_assigned.task_id WHERE user_id = $1
  AND $4::boolean = true OR (
    $4::boolean = false AND complete = $2 AND (
      $2 = false OR ($2 = true AND completed_at > $3)
    )
  )
  ORDER BY task_assigned.assigned_date DESC;

-- name: GetAssignedTasksProjectForUserID :many
SELECT task.* FROM task_assigned
  INNER JOIN task ON task.task_id = task_assigned.task_id
  INNER JOIN task_group ON task_group.task_group_id = task.task_group_id
  WHERE user_id = $1
  AND $4::boolean = true OR (
    $4::boolean = false AND complete = $2 AND (
      $2 = false OR ($2 = true AND completed_at > $3)
    )
  )
  ORDER BY task_group.project_id DESC, task_assigned.assigned_date DESC;

-- name: GetProjectIdMappings :many
SELECT project_id, task_id FROM task
INNER JOIN task_group ON task_group.task_group_id = task.task_group_id
  WHERE task_id = ANY($1::uuid[]);

-- name: GetAssignedTasksDueDateForUserID :many
SELECT task.* FROM task_assigned
  INNER JOIN task ON task.task_id = task_assigned.task_id
  INNER JOIN task_group ON task_group.task_group_id = task.task_group_id
  WHERE user_id = $1
  AND $4::boolean = true OR (
    $4::boolean = false AND complete = $2 AND (
      $2 = false OR ($2 = true AND completed_at > $3)
    )
  )
  ORDER BY task.due_date DESC, task_group.project_id DESC;

-- name: GetCommentCountForTask :one
SELECT COUNT(*) FROM task_comment WHERE task_id = $1;
