module.exports.up = (knex) =>
  knex.raw(`
    CREATE SEQUENCE next_id_seq;

    CREATE FUNCTION next_id(OUT id BIGINT) AS $$
      DECLARE
        shard INT := 1;
        epoch BIGINT := 1567191600000;

        sequence BIGINT;
        milliseconds BIGINT;
      BEGIN
        SELECT nextval('next_id_seq') % 1024 INTO sequence;
        SELECT FLOOR(EXTRACT(EPOCH FROM clock_timestamp()) * 1000) INTO milliseconds;

        id := (milliseconds - epoch) << 23;
        id := id | (shard << 10);
        id := id | (sequence);
      END;
    $$ LANGUAGE PLPGSQL;
  `);

module.exports.down = (knex) =>
  knex.raw(`
    DROP SEQUENCE next_id_seq;
    DROP FUNCTION next_id(OUT id BIGINT);
  `);
