CREATE TABLE users (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    wallet varchar(64),
    name varchar(32) not null
);

CREATE TABLE resource (
    id serial primary key,
    name varchar(32) not null unique
);

CREATE TABLE staking_source (
    id serial primary key,
    name varchar not null,
    description varchar not null,
    user_id UUID not null,
    address varchar(128) not null,
    created_at timestamp with time zone default timezone('UTC', now()),
    CONSTRAINT fk_user_staking_source FOREIGN KEY(user_id)
        REFERENCES users(id) ON DELETE CASCADE
);

CREATE TABLE resource_well (
    id serial primary key,
    resource_id integer not null,
    source_id integer not null,
    supply integer not null,
    CONSTRAINT fk_sid_resource_well FOREIGN KEY(source_id)
        REFERENCES staking_source(id) ON DELETE CASCADE,
  CONSTRAINT fk_rid_resource_well FOREIGN KEY(resource_id)
        REFERENCES resource(id)
);

CREATE TABLE inventory_item (
    id serial primary key,
    user_id UUID not null,
    tier integer not null default 0,
    store_item_id varchar not null,
    created_at timestamp with time zone default timezone('UTC', now()),
    CONSTRAINT fk_user_inventory_item FOREIGN KEY(user_id)
        REFERENCES users(id) ON DELETE CASCADE
    CONSTRAINT uk_user_store_item UNIQUE (user_id, store_item_id)
);

CREATE TABLE upgrade_event (
    id serial primary key,
    inventory_item_id integer not null,
    created_at timestamp with time zone default timezone('UTC', now()),
    CONSTRAINT fk_iid_upgrade_event FOREIGN KEY(inventory_item_id)
        REFERENCES inventory_item(id)
);

CREATE TABLE staking_event (
    id serial primary key,
    user_id UUID not null,
    well_id integer not null,
    inventory_item_id integer not null,
    duration_in_mins integer not null,
    stake_amount integer not null,
    created_at timestamp with time zone default timezone('UTC', now()),
    CONSTRAINT fk_user_staking_event FOREIGN KEY(user_id)
        REFERENCES users(id) ON DELETE CASCADE,
    CONSTRAINT fk_wid_staking_event FOREIGN KEY(well_id)
        REFERENCES resource_well(id),
    CONSTRAINT fk_iiid_staking_event FOREIGN KEY(inventory_item_id)
        REFERENCES inventory_item(id)
);

CREATE TABLE claim_event (
    id serial primary key,
    staking_event_id integer not null,
    claim_amount integer not null,
    created_at timestamp with time zone default timezone('UTC', now()),
    CONSTRAINT fk_se_claim_event FOREIGN KEY(staking_event_id)
        REFERENCES staking_event(id) ON DELETE CASCADE
);

CREATE TABLE bank_account (
    id serial primary key,
    user_id UUID not null,
    balance integer not null default 0 CHECK (balance >= 0),
    CONSTRAINT fk_user_bank_account FOREIGN KEY(user_id)
        REFERENCES users(id) ON DELETE CASCADE
);

CREATE TABLE resource_account (
    id serial primary key,
    resource_id integer not null,
    user_id UUID not null,
    balance integer not null default 0 CHECK (balance >= 0),
    CONSTRAINT fk_user_resource_account FOREIGN KEY(user_id)
        REFERENCES users(id) ON DELETE CASCADE,
    CONSTRAINT fk_rid_resource_account FOREIGN KEY(resource_id)
        REFERENCES resource(id)
);
