-- :name create-project :<! :1
insert into projects (id, "user", name)
values (:id, :user, :name)
returning *;

-- :name update-project :<! :1
update projects
   set name = :name,
       version = :version
 where id = :id
   and "user" = :user
   and deleted_at is null
returning *;

-- :name delete-project :! :n
update projects
   set deleted_at = clock_timestamp()
 where id = :id
   and "user" = :user
   and deleted_at is null;

-- :name get-project-by-id :? :1
select p.*
  from projects as p
 where p.id = :id
   and p.deleted_at is null;

-- :name get-projects :? :*
select distinct
       pr.*,
       ps.token as share_token,
       count(pg.id) over win as total_pages,
       first_value(pg.id) over win as page_id,
       first_value(pg.data) over win as page_data,
       first_value(pg.name) over win as page_name,
       first_value(pg.version) over win as page_version,
       first_value(pg.created_at) over win as page_created_at,
       first_value(pg.metadata) over win as page_metadata,
       first_value(pg.modified_at) over win as page_modified_at
  from projects as pr
 inner join project_shares as ps
         on (ps.project = pr.id)
  left join pages as pg
         on (pg.project = pr.id and pg.deleted_at is null)
 where pr.deleted_at is null
   and pr."user" = :user
window win as (partition by pr.id
               order by pg.created_at
               range between unbounded preceding
                         and unbounded following)
 order by pr.created_at asc;

-- :name get-project-by-share-token :? :*
select p.*
  from projects as p
 inner join project_shares as ps
         on (p.id = ps.project)
  where ps.token = :token;

-- :name get-share-tokens-for-project
select s.*
  from project_shares as s
 where s.project = :project
 order by s.created_at desc;