create table clients
(
    id             uuid             default gen_random_uuid()
        constraint client_pk
            primary key,
    client_id      varchar not null
        constraint client_client_id_key
            unique,
    client_secret  varchar not null,
    name           varchar not null,
    description    varchar          default '',
    private_key    text    not null,
    encryption_key text    not null,
    grant_types    jsonb   not null default '[]'::jsonb,
    capabilities   jsonb   not null default '[]'::jsonb,
    confidential   boolean not null default true,
    created_at     timestamp        default now(),
    updated_at     timestamp        default now()
);

create table client_redirect_uris
(
    id           uuid default gen_random_uuid()
        constraint client_redirect_uris_pk
            primary key,
    client_id    uuid    not null
        constraint client_redirect_uris_client_id_fk
            references clients
            on delete cascade,
    redirect_uri varchar not null
);

create table scopes
(
    id          uuid default gen_random_uuid()
        constraint scopes_pk
            primary key,
    name        varchar not null
        constraint scopes_name_key
            unique,
    description varchar
);

create table client_scopes
(
    id        uuid default gen_random_uuid()
        constraint client_scopes_pk
            primary key,
    client_id uuid not null
        constraint client_scopes_client_id_fk
            references clients
            on delete cascade,
    scope_id  uuid not null
        constraint client_scopes_scope_id_fk
            references scopes
            on delete cascade,
    constraint client_scopes_client_id_scope_id_key
        unique (client_id, scope_id)
);

create table users
(
    id         uuid      default gen_random_uuid()
        constraint users_pk
            primary key,
    first_name varchar not null,
    last_name  varchar not null,
    email      varchar not null
        constraint users_email_key
            unique,
    password   varchar not null,
    created_at timestamp default now(),
    updated_at timestamp default now()
);

create table client_users
(
    id        uuid default gen_random_uuid()
        constraint client_users_pk
            primary key,
    client_id uuid not null
        constraint client_users_client_id_fk
            references clients
            on delete cascade,
    user_id   uuid not null
        constraint client_users_user_id_fk
            references users
            on delete cascade,
    constraint client_users_client_id_user_id_key
        unique (client_id, user_id)
);
