CREATE TABLE documents (
    id uuid primary key DEFAULT uuid_generate_v7(),
    clientId uuid not null,
    hash text not null,
    foreign key (clientId) references clients(id),
    unique(clientId, hash)
);

CREATE TABLE documentEntries (
    id uuid primary key DEFAULT uuid_generate_v7(),
    documentId uuid not null,
    bucket text not null,
    key text not null,
    foreign key (documentId) references documents(id)
);

CREATE TYPE cleanFailType AS ENUM (
    'invalid_mimetype',
    'invalid_read',
    'invalid_read_pages',
    'zero_page_count',
    'large_page_count',
    'large_file',
    'small_dimensions',
    'large_dimensions',
    'small_dpi',
    'large_dpi'
);
CREATE TYPE cleanMimeType AS ENUM ('application/pdf');

CREATE TABLE documentCleans (
    id uuid primary key DEFAULT uuid_generate_v7(),
    documentId uuid not null,
    bucket text,
    key text,
    mimetype cleanMimeType,
    fail cleanFailType,
    foreign key (documentId) references documents(id),
    CONSTRAINT bucket_and_key_together CHECK ((bucket IS NULL) = (key IS NULL) and (bucket is null) = (mimetype is null)),
    CONSTRAINT location_xor_fail CHECK (
    (bucket IS NOT NULL) != (fail IS NOT NULL)
  )
);

CREATE TABLE documentCleanEntries (
    id uuid primary key DEFAULT uuid_generate_v7(),
    cleanId uuid not null,
    version bigint not null,
    foreign key (cleanId) references documentCleans(id)
);

CREATE TABLE documentTextExtractions (
    id uuid primary key DEFAULT uuid_generate_v7(),
    cleanEntryId uuid not null,
    version bigint not null,
    bucket text not null,
    key text not null,
    foreign key (cleanEntryId) references documentCleans(id)
);
