CREATE TABLE IF NOT EXISTS virtual_domains (
    id integer primary key generated by default as identity,
    name varchar(50) NOT NULL UNIQUE
);

{% for domain in virtual_domains %}
INSERT INTO virtual_domains (name) VALUES ('{{ domain }}') ON CONFLICT (name) DO NOTHING;
{% endfor %}

CREATE TABLE IF NOT EXISTS virtual_users (
    id integer primary key generated by default as identity,
    domain_id integer NOT NULL,
    email varchar(254) NOT NULL UNIQUE,
    password varchar(150) NOT NULL,
    quota bigint NOT NULL DEFAULT 0,
    FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
);

{% for domain in virtual_domains %}
{% for user in mailserver_database.virtual_users %}
INSERT INTO virtual_users (domain_id, email, password, quota) VALUES (
    (SELECT id FROM virtual_domains WHERE name = '{{ domain }}'),
    '{{ user.name }}@{{ domain }}',
    {# same as `doveadm pw -s BLF-CRYPT -p ${user.pwd}` -#}
    '{BLF-CRYPT}{{ user.pwd | password_hash('blowfish') }}',
    0
) ON CONFLICT (email) DO UPDATE SET password = EXCLUDED.password, quota = EXCLUDED.quota;
{% endfor %}
{% endfor %}

CREATE TABLE IF NOT EXISTS virtual_aliases (
    id integer primary key generated by default as identity,
    domain_id integer NOT NULL,
    source varchar(254) NOT NULL,
    destination varchar(254) NOT NULL,
    FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
);
CREATE UNIQUE INDEX IF NOT EXISTS virtual_aliases_s_d_key ON virtual_aliases (source, destination);

{% for domain in virtual_domains %}
{% for alias in mailserver_database.virtual_aliases %}
INSERT INTO virtual_aliases (domain_id, source, destination) VALUES (
    (SELECT id FROM virtual_domains WHERE name = '{{ domain }}'),
    '{{ alias.source }}@{{ domain }}',
    '{{ alias.destination }}@{{ domain }}'
) ON CONFLICT (source, destination) DO NOTHING;
{% endfor %}
{% endfor %}