CREATE EXTENSION IF NOT EXISTS citext;

CREATE TABLE person (
    id                          serial          PRIMARY KEY,
    name                        text            not null,
    email                       citext          not null unique,
    is_enabled                  boolean         not null default true,
    is_admin                    boolean         not null default false,
    created_at                  timestamptz     not null default current_timestamp
);

-- Settings for a given user.  | Use with care, add things to the data model when you should.
CREATE TABLE person_settings (
    id                          serial          PRIMARY KEY,
    person_id                   int             not null references person(id),
    name                        text            not null,
    value                       json            not null default '{}',
    created_at                  timestamptz     not null default current_timestamp,

    -- Allow ->find_or_new_related()
    CONSTRAINT unq_person_id_name UNIQUE(person_id, name)
);

CREATE TABLE auth_password (
    person_id                   int             not null unique references person(id),
    password                    text            not null,
    salt                        text            not null,
    updated_at                  timestamptz     not null default current_timestamp,
    created_at                  timestamptz     not null default current_timestamp
);

CREATE TABLE auth_token (
    id                          serial          PRIMARY KEY,
    person_id                   int             not null references person(id),
    scope                       text            not null,
    token                       text            not null,
    created_at                  timestamptz     not null default current_timestamp
);

CREATE TABLE domain (
    id                          serial          PRIMARY KEY,
    person_id                   int             not null references person(id),
    name                        citext          not null unique,
    ssl                         text            default null,
    created_at                  timestamptz     not null default current_timestamp
);

CREATE TABLE blog (
    id                          serial          PRIMARY KEY,
    person_id                   int             not null references person(id),
    domain_id                   int             references domain(id),

    -- Settings: File Allowances
    max_static_file_count       int             not null default 100,
    max_static_file_size        int             not null default   5, -- MiB
    max_static_webroot_size     int             not null default  50, -- MiB

    -- Settings: Build Timers
    minutes_wait_after_build    int             not null default 10,
    builds_per_hour             int             not null default  3,
    builds_per_day              int             not null default 12,

    -- Settings: Features
    build_priority              int             not null default 1,

    is_enabled                  boolean         not null default true,
    created_at                  timestamptz     not null default current_timestamp
);

CREATE TABLE ssh_key (
    id                          serial          PRIMARY KEY,
    person_id                   int             not null references person(id),
    title                       text            ,
    public_key                  text            not null,
    private_key                 text            not null,
    created_at                  timestamptz     not null default current_timestamp
);

CREATE TABLE basic_auth (
    id                          serial          PRIMARY KEY,
    person_id                   int             not null references person(id),
    username                    text            not null,
    password                    text            not null,
    created_at                  timestamptz     not null default current_timestamp
);

CREATE TABLE repo (
    id                          serial          PRIMARY KEY,
    blog_id                     int             references blog(id),
    url                         text            not null,

    -- Auth methods for the url.
    basic_auth_id               int             references basic_auth(id),
    ssh_key_id                  int             references ssh_key(id),

    created_at                  timestamptz     not null default current_timestamp
);

--
-- TODO: Remove this after everything is updated for the jobs table 
CREATE TABLE build (
    id                          serial          PRIMARY KEY,
    blog_id                     int             not null references blog(id),
    job_id                      int             not null, -- For minion->job($id)
    created_at                  timestamptz     not null default current_timestamp
);

-- For jobs that should show up on the web interface in Blog Manager -> Jobs.
CREATE TABLE job (
    id                          serial          PRIMARY KEY,
    blog_id                     int             not null references blog(id),
    minion_job_id               int             not null, -- For minion->job($id)
    created_at                  timestamptz     not null default current_timestamp
);

-- For jobs that should show up on the web interface in Admin Panel -> Jobs.
CREATE TABLE admin_job (
    id                          serial          PRIMARY KEY,
    minion_job_id               int             not null, -- For minion->job($id)
    created_at                  timestamptz     not null default current_timestamp
);

-- The domains that a user can host their blog under.
CREATE TABLE hosted_domain (
    id                          serial          PRIMARY KEY,
    name                        text            not null,
    letsencrypt_challenge       text            not null default 'http', -- http or dns
    letsencrypt_dns_auth        json            not null default '{}',
    created_at                  timestamptz     not null default current_timestamp
);

-- Servers that we will deploy the blogs to.
CREATE TABLE servers (
    id                          serial          PRIMARY KEY,
    hostname                    text            not null,
    created_at                  timestamptz     not null default current_timestamp
);
