CREATE EXTENSION "uuid-ossp";

CREATE TYPE "Role" AS ENUM (
    'admin',
    'user'
    );

CREATE TYPE "OrderStatus" AS ENUM (
    'confirmed',
    'cancelled',
    'delivered',
    'payed',
    'require_refund',
    'refunded'
    );

CREATE TYPE "QuantityUnit" AS ENUM (
    'g',
    'dkg',
    'kg',
    'piece'
    );

CREATE TABLE accounts
(
    id        serial  not null primary key,
    email     varchar not null unique,
    login     varchar not null unique,
    pass_hash varchar not null,
    role      "Role"  not null default 'user'
);

CREATE TABLE products
(
    id                serial  not null primary key,
    name              varchar not null unique,
    short_description varchar not null,
    long_description  varchar not null,
    category          varchar,
    price_major       int     not null,
    price_minor       int     not null,
    CONSTRAINT positive_price_minor check ( price_major >= 0 )
);

CREATE TABLE stocks
(
    id            serial                       not null primary key,
    product_id    int references products (id) not null unique,
    quantity      int                          not null default 0,
    quantity_unit "QuantityUnit"               not null,
    CONSTRAINT positive_quantity check ( quantity >= 0 )
);

CREATE TABLE account_orders
(
    id       serial                       not null primary key,
    buyer_id int references accounts (id) not null,
    status   "OrderStatus"                not null default 'confirmed'
);

CREATE TABLE order_items
(
    id            serial                       not null primary key,
    product_id    int references products (id) not null,
    order_id      int references account_orders (id),
    quantity      int                          not null default 0,
    quantity_unit "QuantityUnit"               not null,
    CONSTRAINT positive_quantity check ( quantity >= 0 )
);

CREATE TABLE statistics
(
    id     serial  not null primary key,
    url    varchar not null,
    clicks int     not null default 0,
    date   DATE    not null default now(),
    CONSTRAINT positive_clicks check ( clicks >= 0 )
);
