create table users(
    id uuid primary key,
    name varchar(32) not null unique,
    password varchar(128)
);

create table accounts(
    id uuid primary key,
    "user" uuid not null references users(id),
    name varchar(32) not null,
    balance bigint not null default 0 constraint positive_balance check (balance >= 0),
    unique ("user", name)
);

create table transactions(
    id uuid primary key,
    "from" uuid not null references accounts(id),
    "to" uuid not null references accounts(id),
    amount bigint not null constraint positive_amount check (amount > 0),
    timestamp timestamp with time zone not null default now(),
    message text
);

create index transactions_from on transactions ("from");
create index transactions_to on transactions ("to");

create view transactions_with_user_info as select
    t.amount,
    t.message,
    t.timestamp,
    -- From Participant
    uf.id AS from_user_id,
    t."from" as from_account_id,
    uf.name AS from_user_name, 
    af.name AS from_account_name, 
    -- To Participant
    ut.id AS to_user_id, 
    t."to" as to_account_id,
    ut.name AS to_user_name, 
    at.name AS to_account_name
from transactions t
join accounts af ON t."from" = af.id
join users uf ON af."user" = uf.id
join accounts at ON t."to" = at.id
join users ut ON at."user" = ut.id;
