drop table if exists users;
drop table if exists accounts;
drop table if exists users_accounts;
drop table if exists transactions;
drop table if exists accounts_transactions;
drop table if exists notifications;
drop table if exists users_notifications;
drop table if exists exchange;

create table users (
	id integer primary key autoincrement,
	username text unique not null,
	email text unique not null,
	otp text not null,
	fullname text not null
);

create table accounts (
	id integer primary key autoincrement,
	iban text unique not null,   -- RO16 FOXB 0000 0000 0000 0000
	currency text not null,      -- EUR, RON, USD, ?
	account_type text not null,  -- checking, savings, ?
	custom_name text             -- 'Car Savings'; name set by user
);

create table users_accounts (
	user_id integer not null,           -- one user can have multiple accounts
	account_id integer UNIQUE not null, -- one account can only have one user
	foreign key (user_id) references users (id),
	foreign key (account_id) references accounts (id)
);

create table transactions (
	id integer primary key autoincrement,
	datetime text not null,
	other_party text not null, -- JSON data describing sender/recipient/etc 
	                           -- depending on transaction type
	status text not null,      -- processed, failed, reverted, pending, etc
	type text not null,        -- send_transfer, receive_transfer, card_payment, fee, ...
	extra text                 -- depending on type, JSON data describing extra info
);

create table accounts_transactions (
	account_id integer not null,
	transaction_id integer UNIQUE not null,
	foreign key (account_id) references accounts (id),
	foreign key (transaction_id) references transactions (id)
);

create table notifications (
	id integer primary key autoincrement,
	body text not null,
	datetime text not null,
	read integer not null
);

create table users_notifications (
	user_id integer not null,
	notification_id integer UNIQUE not null,
	foreign key (user_id) references users (id),
	foreign key (notification_id) references notifications (id)
);

create table exchange (
	id integer primary key autoincrement,
	currency text not null,
	to_ron real not null,
	from_ron real not null
);

create view V_account_balance as
select 
	accounts_transactions.account_id as "account_id",
	sum(json_extract(transactions.extra, '$.amount')) as "balance"
from transactions
inner join accounts_transactions on accounts_transactions.transaction_id = transactions.id
group by accounts_transactions.account_id;
