CREATE TABLE users (
    id bigint IDENTITY(1,1) NOT NULL,
    nick character varying(64) NOT NULL,
    passw character varying(32) NOT NULL,
    lang VARCHAR(10) CHECK(lang IN ('ru', 'en', '__')) DEFAULT '__' NOT NULL,
    banned smallint DEFAULT (0) NOT NULL,
    lastmessage datetimeoffset,
    lastpm bigint DEFAULT (0) NOT NULL,
    lastphoto bigint DEFAULT (0) NOT NULL,
    karma smallint DEFAULT (0) NOT NULL,
    last_seen datetimeoffset,
    UNIQUE(nick),
    PRIMARY KEY (id)
);
CREATE TABLE user_services (
    user_id bigint NOT NULL,
    regid character varying(1024) NOT NULL,
    ts datetimeoffset DEFAULT CURRENT_TIMESTAMP NOT NULL, service_type varchar(255) not null default 'fcm',
    FOREIGN KEY (user_id) REFERENCES users(id),
    UNIQUE (regid)
);
CREATE TABLE auth (
    user_id bigint,
    protocol VARCHAR(10) CHECK (protocol IN ('xmpp', 'email', 'sms')) NOT NULL,
    account character varying(128) NOT NULL,
    authcode character varying(8) NOT NULL,
    ts datetimeoffset DEFAULT CURRENT_TIMESTAMP NOT NULL,
    FOREIGN KEY (user_id) REFERENCES users(id)
);
CREATE TABLE tags (
    tag_id INTEGER IDENTITY(1,1) PRIMARY KEY NOT NULL,
    synonym_id integer,
    name character varying(70),
    notop bit DEFAULT 0 NOT NULL,
    noindex bit DEFAULT 0 NOT NULL,
    stat_messages bigint DEFAULT (0) NOT NULL,
    stat_users smallint DEFAULT (0) NOT NULL,
    FOREIGN KEY (synonym_id) REFERENCES tags(tag_id)
);
CREATE TABLE bl_tags (
    user_id bigint NOT NULL,
    tag_id integer NOT NULL,
    FOREIGN KEY (user_id) REFERENCES users(id),
    FOREIGN KEY (tag_id) REFERENCES tags(tag_id)
);
CREATE TABLE bl_users (
    user_id bigint NOT NULL,
    bl_user_id bigint NOT NULL,
    ts datetimeoffset DEFAULT CURRENT_TIMESTAMP NOT NULL,
    PRIMARY KEY (user_id, bl_user_id),
    FOREIGN KEY (user_id) REFERENCES users(id),
    FOREIGN KEY (bl_user_id) REFERENCES users(id)
);
CREATE TABLE emails (
    user_id bigint NOT NULL,
    email character varying(128) NOT NULL,
    subscr_hour smallint,
    FOREIGN KEY (user_id) REFERENCES users(id)
);
CREATE TABLE facebook (
    user_id bigint,
    fb_id numeric,
    loginhash character varying(36),
    access_token character varying(255),
    ts datetimeoffset DEFAULT CURRENT_TIMESTAMP NOT NULL,
    fb_name character varying(64),
    fb_link character varying(255) NOT NULL,
    crosspost bit DEFAULT 1 NOT NULL,
    FOREIGN KEY (user_id) REFERENCES users(id)
);
CREATE TABLE reactions (
    like_id INTEGER PRIMARY KEY NOT NULL,
    description character varying(100) NOT NULL
);
CREATE TABLE favorites (
    user_id bigint NOT NULL,
    message_id bigint NOT NULL,
    ts datetimeoffset,
    like_id INTEGER DEFAULT 1 NOT NULL,
    user_uri character varying(255) NOT NULL DEFAULT '',
    FOREIGN KEY (like_id) REFERENCES reactions(like_id)
);
CREATE TABLE followers (
    user_id bigint,
    ts datetimeoffset DEFAULT CURRENT_TIMESTAMP NOT NULL,
    acct character varying(64) NOT NULL,
    PRIMARY KEY (user_id),
    FOREIGN KEY (user_id) REFERENCES users(id)
);
CREATE TABLE jids (
    user_id bigint,
    jid character varying(64) NOT NULL,
    active smallint DEFAULT 0 NOT NULL,
    loginhash character varying(36),
    ts datetimeoffset DEFAULT CURRENT_TIMESTAMP NOT NULL,
    FOREIGN KEY (user_id) REFERENCES users(id)
);
CREATE TABLE logins (
    user_id bigint NOT NULL,
    hash character varying(16) NOT NULL,
    FOREIGN KEY (user_id) REFERENCES users(id)
);
CREATE TABLE meon (
    id INTEGER NOT NULL,
    user_id bigint NOT NULL,
    link character varying(255) NOT NULL,
    name character varying(32) NOT NULL,
    ico smallint,
    FOREIGN KEY (user_id) REFERENCES users(id)
);
CREATE TABLE messages (
    message_id INTEGER IDENTITY(1,1) PRIMARY KEY NOT NULL,
    user_id bigint NOT NULL,
    lang varchar(max) DEFAULT '__' NOT NULL,
    ts datetimeoffset DEFAULT CURRENT_TIMESTAMP NOT NULL,
    replies smallint DEFAULT (0) NOT NULL,
    maxreplyid smallint DEFAULT (0) NOT NULL,
    privacy smallint DEFAULT (1) NOT NULL,
    readonly bit DEFAULT 0 NOT NULL,
    attach VARCHAR(10) CHECK (attach IN ('jpg', 'mp4', 'png')),
    place_id bigint,
    lat numeric(10,7),
    lon numeric(10,7),
    popular smallint DEFAULT (0) NOT NULL,
    hidden smallint DEFAULT (0) NOT NULL,
    likes smallint DEFAULT (0) NOT NULL,
    updated datetimeoffset DEFAULT CURRENT_TIMESTAMP NOT NULL,
    FOREIGN KEY (user_id) REFERENCES users(id)
);
CREATE TABLE messages_access (
    message_id INTEGER NOT NULL,
    user_id bigint NOT NULL,
    FOREIGN KEY (user_id) REFERENCES users(id),
    FOREIGN KEY (message_id) REFERENCES messages(message_id)
);
CREATE TABLE messages_properties (
    message_id INTEGER NOT NULL,
    reply_id smallint NOT NULL,
    property_key character varying(255) NOT NULL,
    property_value character varying(255) NOT NULL,
    UNIQUE (message_id, reply_id, property_key),
    FOREIGN KEY (message_id) REFERENCES messages(message_id)
);
CREATE TABLE messages_tags (
    message_id INTEGER NOT NULL,
    tag_id bigint NOT NULL,
    FOREIGN KEY (message_id) REFERENCES messages(message_id)
);
CREATE TABLE messages_txt (
    message_id INTEGER NOT NULL,
    repliesby varchar(max),
    txt varchar(max) NOT NULL,
    updated_at datetimeoffset DEFAULT CURRENT_TIMESTAMP NOT NULL,
    FOREIGN KEY (message_id) REFERENCES messages(message_id)
);
CREATE TABLE places (
    place_id INTEGER PRIMARY KEY NOT NULL,
    lat numeric(10,7) NOT NULL,
    lon numeric(10,7) NOT NULL,
    name character varying(64) NOT NULL,
    descr character varying(255),
    url character varying(128),
    user_id bigint NOT NULL,
    ts datetimeoffset DEFAULT CURRENT_TIMESTAMP NOT NULL
);
CREATE TABLE places_tags (
    place_id INTEGER NOT NULL,
    tag_id bigint NOT NULL,
    FOREIGN KEY (place_id) REFERENCES places(place_id)
);
CREATE TABLE pm (
    user_id bigint NOT NULL,
    user_id_to bigint NOT NULL,
    ts datetimeoffset DEFAULT CURRENT_TIMESTAMP NOT NULL,
    txt varchar(max) NOT NULL,
    FOREIGN KEY (user_id) REFERENCES users(id),
    FOREIGN KEY (user_id_to) REFERENCES users(id)
);
CREATE TABLE replies (
    message_id integer NOT NULL,
    reply_id smallint NOT NULL,
    user_id bigint NOT NULL,
    replyto smallint DEFAULT (0) NOT NULL,
    ts datetimeoffset DEFAULT CURRENT_TIMESTAMP NOT NULL,
    attach VARCHAR(10) CHECK (attach IN ('jpg', 'mp4', 'png')),
    txt varchar(max) NOT NULL,
    updated_at datetimeoffset DEFAULT CURRENT_TIMESTAMP NOT NULL,
    user_uri character varying(255) DEFAULT NULL,
    reply_uri character varying(255) DEFAULT NULL,
    html smallint DEFAULT '0' NOT NULL,
    FOREIGN KEY (message_id) REFERENCES messages(message_id),
    FOREIGN KEY (user_id) REFERENCES users(id)
);
CREATE TABLE subscr_messages (
    message_id integer NOT NULL,
    suser_id bigint NOT NULL,
    last_read_rid smallint DEFAULT 0 NOT NULL,
    FOREIGN KEY (message_id) REFERENCES messages(message_id),
    FOREIGN KEY (suser_id) REFERENCES users(id)
);
CREATE TABLE subscr_tags (
    tag_id integer NOT NULL,
    suser_id bigint NOT NULL,
    FOREIGN KEY (tag_id) REFERENCES tags(tag_id),
    FOREIGN KEY (suser_id) REFERENCES users(id)
);
CREATE TABLE subscr_users (
    user_id bigint NOT NULL,
    suser_id bigint NOT NULL,
    ts datetimeoffset DEFAULT CURRENT_TIMESTAMP NOT NULL,
    FOREIGN KEY (user_id) REFERENCES users(id),
    FOREIGN KEY (suser_id) REFERENCES users(id)
);
CREATE TABLE users_subscr (
    user_id bigint NOT NULL,
    cnt INTEGER NOT NULL DEFAULT 0
);
CREATE TABLE tags_ignore (
    tag_id integer NOT NULL,
    FOREIGN KEY (tag_id) REFERENCES tags(tag_id)
);
CREATE TABLE telegram (
    user_id bigint,
    tg_id numeric NOT NULL,
    tg_name character varying(64) NOT NULL,
    ts datetimeoffset DEFAULT CURRENT_TIMESTAMP NOT NULL,
    loginhash character varying(36),
    FOREIGN KEY (user_id) REFERENCES users(id)
);
CREATE TABLE top_ignore_messages (
    message_id integer NOT NULL,
    FOREIGN KEY (message_id) REFERENCES messages(message_id)
);
CREATE TABLE top_ignore_tags (
    tag_id integer NOT NULL,
    FOREIGN KEY (tag_id) REFERENCES tags(tag_id)
);
CREATE TABLE top_ignore_users (
    user_id bigint NOT NULL,
    FOREIGN KEY (user_id) REFERENCES users(id)
);
CREATE TABLE twitter (
    user_id bigint NOT NULL,
    access_token character varying(64) NOT NULL,
    access_token_secret character varying(64) NOT NULL,
    uname character varying(64) NOT NULL,
    ts datetimeoffset DEFAULT CURRENT_TIMESTAMP NOT NULL,
    crosspost bit DEFAULT 1 NOT NULL,
    FOREIGN KEY (user_id) REFERENCES users(id)
);

CREATE TABLE usersinfo (
    user_id bigint NOT NULL,
    jid character varying(64),
    fullname character varying(64),
    country character varying(32),
    url character varying(128),
    gender character varying(32),
    bday character varying(32),
    descr varchar(max),
    UNIQUE(user_id),
    FOREIGN KEY (user_id) REFERENCES users(id)
);
CREATE TABLE vk (
    user_id bigint,
    vk_id numeric NULL,
    loginhash character varying(36),
    access_token character varying(128) NOT NULL,
    ts datetimeoffset DEFAULT CURRENT_TIMESTAMP NOT NULL,
    vk_name character varying(64) NOT NULL,
    vk_link character varying(64) NOT NULL,
    crosspost smallint DEFAULT (1) NOT NULL,
    FOREIGN KEY (user_id) REFERENCES users(id)
);
CREATE TABLE wl_users (
    user_id bigint NOT NULL,
    wl_user_id bigint NOT NULL,
    PRIMARY KEY (user_id, wl_user_id),
    FOREIGN KEY (user_id) REFERENCES users(id),
    FOREIGN KEY (wl_user_id) REFERENCES users(id)
);
CREATE TABLE oauth2_registered_client (
    id varchar(100) NOT NULL,
    client_id varchar(100) NOT NULL,
    client_id_issued_at datetimeoffset DEFAULT CURRENT_TIMESTAMP NOT NULL,
    client_secret varchar(200) DEFAULT NULL,
    client_secret_expires_at datetimeoffset DEFAULT NULL,
    client_name varchar(200) NOT NULL,
    client_authentication_methods varchar(1000) NOT NULL,
    authorization_grant_types varchar(1000) NOT NULL,
    redirect_uris varchar(1000) DEFAULT NULL,
    scopes varchar(1000) NOT NULL,
    client_settings varchar(2000) NOT NULL,
    token_settings varchar(2000) NOT NULL,
    PRIMARY KEY (id)
);
