-- Create schema if it doesn't exist
CREATE SCHEMA IF NOT EXISTS safeqr;


CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

-- Create Enum for scan_history status
CREATE TYPE scan_status AS ENUM ('ACTIVE', 'INACTIVE');

-- safeqr."user" definition

-- Drop table

-- DROP TABLE safeqr."user";

CREATE TABLE safeqr."user" (
	id varchar(255) NOT NULL,
	"name" varchar(255) NULL,
	email varchar(255) NULL,
	"source" varchar(255) NULL,
	date_created timestamptz DEFAULT now() NULL,
	date_updated timestamptz DEFAULT now() NULL,
	roles _text NULL,
	status varchar(255) DEFAULT 'ACTIVE'::character varying NULL,
	gm

-- safeqr.qr_code_types definition

-- Drop table

-- DROP TABLE safeqr.qr_code_types;

CREATE TABLE safeqr.qr_code_types (
	id bigserial NOT NULL,
	"type" varchar(255) NOT NULL,
	description varchar(255) NULL,
	prefix varchar(255) NULL,
	table_name varchar(255) NULL,
	CONSTRAINT qr_code_types_pkey PRIMARY KEY (id)
);

-- safeqr.qr_code definition

-- Drop table

-- DROP TABLE safeqr.qr_code;

CREATE TABLE safeqr.qr_code (
	id uuid DEFAULT safeqr.uuid_generate_v4() NOT NULL,
	qr_code_type_id int8 NULL,
	user_id varchar(255) NULL,
	contents text NULL,
	created_at timestamptz DEFAULT CURRENT_TIMESTAMP NULL,
	CONSTRAINT qr_code_pkey PRIMARY KEY (id),
	CONSTRAINT qr_code_qr_code_type_id_fkey FOREIGN KEY (qr_code_type_id) REFERENCES safeqr.qr_code_types(id),
	CONSTRAINT qr_code_user_id_fkey FOREIGN KEY (user_id) REFERENCES safeqr."user"(id)
);

-- safeqr.scan_history definition

-- Drop table

-- DROP TABLE safeqr.scan_history;

CREATE TABLE safeqr.scan_history (
	id bigserial NOT NULL,
	qr_code_id uuid NULL,
	user_id varchar(255) NULL,
	status varchar(255) DEFAULT 'ACTIVE'::safeqr.scan_status NULL,
	date_created timestamptz DEFAULT CURRENT_TIMESTAMP NOT NULL,
	date_updated timestamptz DEFAULT CURRENT_TIMESTAMP NOT NULL,
	bookmarked bool DEFAULT false NULL,
	CONSTRAINT scan_history_pkey PRIMARY KEY (id),
	CONSTRAINT scan_history_fk FOREIGN KEY (qr_code_id) REFERENCES safeqr.qr_code(id) ON DELETE CASCADE ON UPDATE CASCADE
);

-- safeqr.scan_bookmark definition

-- Drop table

-- DROP TABLE safeqr.scan_bookmark;

CREATE TABLE safeqr.scan_bookmark (
	id bigserial NOT NULL,
	qr_code_id uuid NULL,
	user_id varchar(255) NULL,
	status varchar(255) DEFAULT 'ACTIVE'::safeqr.bookmark_status NULL,
	date_created timestamptz DEFAULT CURRENT_TIMESTAMP NOT NULL,
	date_updated timestamptz DEFAULT CURRENT_TIMESTAMP NOT NULL,
	CONSTRAINT scan_bookmark_pkey PRIMARY KEY (id),
	CONSTRAINT scan_bookmark_fk FOREIGN KEY (qr_code_id) REFERENCES safeqr.qr_code(id) ON DELETE CASCADE ON UPDATE CASCADE
);

-- safeqr.url definition

-- Drop table

-- DROP TABLE safeqr.url;

CREATE TABLE safeqr.url (
	id uuid DEFAULT safeqr.uuid_generate_v4() NOT NULL,
	qr_code_id uuid NULL,
	"domain" text NULL,
	subdomain text NULL,
	top_level_domain text NULL,
	query text NULL,
	fragment text NULL,
	redirect int4 DEFAULT 0 NULL,
	"path" text NULL,
	redirect_chain _text NULL,
	hsts_header _text NULL,
	ssl_stripping _bool NULL,
	CONSTRAINT url_pkey PRIMARY KEY (id),
	CONSTRAINT url_qr_code_id_fkey FOREIGN KEY (qr_code_id) REFERENCES safeqr.qr_code(id)
);

-- safeqr."text" definition

-- Drop table

-- DROP TABLE safeqr."text";

CREATE TABLE safeqr."text" (
	id uuid DEFAULT safeqr.uuid_generate_v4() NOT NULL,
	qr_code_id uuid NULL,
	"text" varchar(2048) NULL,
	CONSTRAINT text_pkey PRIMARY KEY (id),
	CONSTRAINT text_fk FOREIGN KEY (qr_code_id) REFERENCES safeqr.qr_code(id) ON DELETE CASCADE ON UPDATE CASCADE
);

-- safeqr.phone definition

-- Drop table

-- DROP TABLE safeqr.phone;

CREATE TABLE safeqr.phone (
	id uuid DEFAULT safeqr.uuid_generate_v4() NOT NULL,
	qr_code_id uuid NULL,
	phone text NULL,
	CONSTRAINT phone_pkey PRIMARY KEY (id),
	CONSTRAINT phone_fk FOREIGN KEY (qr_code_id) REFERENCES safeqr.qr_code(id) ON DELETE CASCADE ON UPDATE CASCADE
);

-- safeqr.sms definition

-- Drop table

-- DROP TABLE safeqr.sms;

CREATE TABLE safeqr.sms (
	id uuid DEFAULT safeqr.uuid_generate_v4() NOT NULL,
	qr_code_id uuid NULL,
	phone text NULL,
	message text NULL,
	CONSTRAINT sms_pkey PRIMARY KEY (id),
	CONSTRAINT sms_fk FOREIGN KEY (qr_code_id) REFERENCES safeqr.qr_code(id)
);

-- Create Email table
CREATE TABLE safeqr.email (
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    qr_code_id UUID REFERENCES safeqr.qr_code(id),
    email VARCHAR(200),
    title VARCHAR(200),
    message VARCHAR(7089)
);

-- Create GeoLocation table
CREATE TABLE safeqr.geolocation (
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    qr_code_id UUID REFERENCES safeqr.qr_code(id),
    latitude DOUBLE PRECISION,
    longitude DOUBLE PRECISION
);

-- Create Wifi table
CREATE TABLE safeqr.wifi (
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    qr_code_id UUID REFERENCES safeqr.qr_code(id),
    ssid VARCHAR(200),
    password VARCHAR(200),
    encryption VARCHAR(200),
    hidden BOOLEAN
);

-- Create Bitcoin table
CREATE TABLE safeqr.bitcoin (
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    qr_code_id UUID REFERENCES safeqr.qr_code(id),
    address VARCHAR(200),
    amount BIGINT,
    message VARCHAR(250)
);

-- Create VCard table
CREATE TABLE safeqr.vcard (
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    qr_code_id UUID REFERENCES safeqr.qr_code(id),
    version VARCHAR(50),
    name VARCHAR(250),
    organisation VARCHAR(250),
    title VARCHAR(50),
    address VARCHAR(250),
    tel_work VARCHAR(250),
    tel_cell VARCHAR(250),
    email VARCHAR(250),
    url VARCHAR(2048)
);

-- safeqr.gmail_emails definition

-- Drop table

-- DROP TABLE safeqr.gmail_emails;

CREATE TABLE safeqr.gmail_emails (
	user_id varchar NOT NULL,
	subject text NULL,
	date_received timestamptz NULL,
	date_created timestamptz DEFAULT CURRENT_TIMESTAMP NULL,
	message_id varchar NOT NULL,
	history_id int8 NULL,
	id uuid DEFAULT safeqr.uuid_generate_v4() NOT NULL,
	CONSTRAINT gmail_pk PRIMARY KEY (id),
	CONSTRAINT gmail_unique UNIQUE (user_id, message_id),
	CONSTRAINT gmail_user_fk FOREIGN KEY (user_id) REFERENCES safeqr."user"(id) ON DELETE CASCADE ON UPDATE CASCADE
);

-- safeqr.gmail_urls definition

-- Drop table

-- DROP TABLE safeqr.gmail_urls;

CREATE TABLE safeqr.gmail_urls (
	gmail_id uuid NOT NULL,
	image_url text NOT NULL,
	decoded_content varchar NULL,
	qr_code_id uuid NOT NULL,
	id uuid DEFAULT safeqr.uuid_generate_v4() NOT NULL,
	CONSTRAINT gmail_urls_pk PRIMARY KEY (id),
	CONSTRAINT gmail_urls_unique UNIQUE (gmail_id, image_url, decoded_content),
	CONSTRAINT gmail_urls_gmail_emails_fk FOREIGN KEY (gmail_id) REFERENCES safeqr.gmail_emails(id) ON DELETE CASCADE ON UPDATE CASCADE,
	CONSTRAINT gmail_urls_qr_code_fk FOREIGN KEY (qr_code_id) REFERENCES safeqr.qr_code(id) ON DELETE CASCADE ON UPDATE CASCADE
);

-- safeqr.gmail_cid definition

-- Drop table

-- DROP TABLE safeqr.gmail_cid;

CREATE TABLE safeqr.gmail_cid (
	gmail_id uuid NOT NULL,
	cid varchar NOT NULL,
	attachment_id text NOT NULL,
	decoded_content text NOT NULL,
	qr_code_id uuid NOT NULL,
	id uuid DEFAULT safeqr.uuid_generate_v4() NOT NULL,
	CONSTRAINT gmail_cid_pk PRIMARY KEY (id),
	CONSTRAINT gmail_cid_unique UNIQUE (gmail_id, cid, decoded_content),
	CONSTRAINT gmail_cid_gmail_emails_fk FOREIGN KEY (gmail_id) REFERENCES safeqr.gmail_emails(id) ON DELETE CASCADE ON UPDATE CASCADE,
	CONSTRAINT gmail_cid_qr_code_fk FOREIGN KEY (qr_code_id) REFERENCES safeqr.qr_code(id) ON DELETE CASCADE ON UPDATE CASCADE
);