CREATE EXTENSION IF NOT EXISTS pgcrypto;

-- UUID v7: 48-bit ms timestamp | 4-bit version (0111) | 12-bit random | 2-bit variant (10) | 62-bit random
CREATE OR REPLACE FUNCTION gen_uuid_v7()
RETURNS uuid
LANGUAGE plpgsql
AS $$
DECLARE
    unix_ms    bigint;
    uuid_bytes bytea;
BEGIN
    unix_ms    := (EXTRACT(EPOCH FROM clock_timestamp()) * 1000)::bigint;
    uuid_bytes := gen_random_bytes(16);
    uuid_bytes := overlay(uuid_bytes PLACING substring(int8send(unix_ms) FROM 3) FROM 1 FOR 6);
    uuid_bytes := set_byte(uuid_bytes, 6, (get_byte(uuid_bytes, 6) & x'0f'::int) | x'70'::int);
    uuid_bytes := set_byte(uuid_bytes, 8, (get_byte(uuid_bytes, 8) & x'3f'::int) | x'80'::int);
    RETURN encode(uuid_bytes, 'hex')::uuid;
END;
$$;

CREATE TABLE users (
    id         UUID        PRIMARY KEY DEFAULT gen_uuid_v7(),
    uuid_key   UUID        NOT NULL    DEFAULT gen_random_uuid(),
    email      TEXT        NOT NULL UNIQUE,
    name       TEXT        NOT NULL,
    created_at TIMESTAMPTZ NOT NULL    DEFAULT now(),
    pass_hash  TEXT        NOT NULL
);
