-- DROP SCHEMA public;

CREATE SCHEMA public AUTHORIZATION pg_database_owner;

COMMENT ON SCHEMA public IS 'standard public schema';
-- public.ad_templates definition

-- Drop table

-- DROP TABLE public.ad_templates;

CREATE TABLE public.ad_templates (
	id uuid NOT NULL,
	user_id uuid NOT NULL,
	"name" text NOT NULL,
	description text NULL,
	vast_tag_url text NOT NULL,
	ad_format varchar(50) DEFAULT 'pre-roll'::character varying NOT NULL,
	duration int8 NULL,
	is_active bool DEFAULT true NOT NULL,
	created_at timestamptz NULL,
	updated_at timestamptz NULL,
	is_default bool DEFAULT false NOT NULL,
	"version" int8 DEFAULT 1 NOT NULL,
	CONSTRAINT ad_templates_pkey PRIMARY KEY (id)
);
CREATE INDEX idx_ad_templates_user_id ON public.ad_templates USING btree (user_id);


-- public.domains definition

-- Drop table

-- DROP TABLE public.domains;

CREATE TABLE public.domains (
	id uuid NOT NULL,
	user_id uuid NOT NULL,
	"name" text NOT NULL,
	created_at timestamptz NULL,
	updated_at timestamptz NULL,
	"version" int8 DEFAULT 1 NOT NULL,
	CONSTRAINT domains_pkey PRIMARY KEY (id)
);
CREATE INDEX idx_domains_user_id ON public.domains USING btree (user_id);


-- public.jobs definition

-- Drop table

-- DROP TABLE public.jobs;

CREATE TABLE public.jobs (
	id uuid DEFAULT gen_random_uuid() NOT NULL,
	status text NULL,
	priority int8 DEFAULT 0 NULL,
	input_url text NULL,
	output_url text NULL,
	total_duration int8 NULL,
	current_time int8 NULL,
	progress numeric NULL,
	agent_id int8 NULL,
	logs text NULL,
	config text NULL,
	cancelled bool DEFAULT false NULL,
	retry_count int8 DEFAULT 0 NULL,
	max_retries int8 DEFAULT 3 NULL,
	created_at timestamptz NULL,
	updated_at timestamptz NULL,
	"version" int8 NULL,
	video_id uuid NULL,
	user_id uuid NULL,
	time_limit int8 DEFAULT 3600000 NULL,
	CONSTRAINT jobs_pkey PRIMARY KEY (id)
);
CREATE INDEX idx_jobs_priority ON public.jobs USING btree (priority);


-- public.notifications definition

-- Drop table

-- DROP TABLE public.notifications;

CREATE TABLE public.notifications (
	id uuid NOT NULL,
	user_id uuid NOT NULL,
	"type" varchar(50) NOT NULL,
	title text NOT NULL,
	message text NOT NULL,
	metadata text NULL,
	action_url text NULL,
	action_label text NULL,
	is_read bool DEFAULT false NOT NULL,
	created_at timestamptz NULL,
	updated_at timestamptz NULL,
	"version" int8 DEFAULT 1 NOT NULL,
	CONSTRAINT notifications_pkey PRIMARY KEY (id)
);
CREATE INDEX idx_notifications_user_id ON public.notifications USING btree (user_id);


-- public."plan" definition

-- Drop table

-- DROP TABLE public."plan";

CREATE TABLE public."plan" (
	id uuid DEFAULT gen_random_uuid() NOT NULL,
	"name" text NOT NULL,
	description text NULL,
	price numeric(65, 30) NOT NULL,
	"cycle" varchar(20) NOT NULL,
	storage_limit int8 NOT NULL,
	upload_limit int4 NOT NULL,
	duration_limit int4 NOT NULL,
	quality_limit text NOT NULL,
	features _text NULL,
	is_active bool DEFAULT true NOT NULL,
	"version" int8 DEFAULT 1 NOT NULL,
	CONSTRAINT plan_pkey PRIMARY KEY (id)
);


-- public.plan_subscriptions definition

-- Drop table

-- DROP TABLE public.plan_subscriptions;

CREATE TABLE public.plan_subscriptions (
	id uuid NOT NULL,
	user_id uuid NOT NULL,
	payment_id uuid NOT NULL,
	plan_id uuid NOT NULL,
	term_months int4 NOT NULL,
	payment_method varchar(20) NOT NULL,
	wallet_amount numeric(65, 30) NOT NULL,
	topup_amount numeric(65, 30) NOT NULL,
	started_at timestamptz NOT NULL,
	expires_at timestamptz NOT NULL,
	reminder_7d_sent_at timestamptz NULL,
	reminder_3d_sent_at timestamptz NULL,
	reminder_1d_sent_at timestamptz NULL,
	created_at timestamptz NULL,
	updated_at timestamptz NULL,
	"version" int8 DEFAULT 1 NOT NULL,
	CONSTRAINT plan_subscriptions_pkey PRIMARY KEY (id)
);
CREATE INDEX idx_plan_subscriptions_expires_at ON public.plan_subscriptions USING btree (expires_at);
CREATE INDEX idx_plan_subscriptions_payment_id ON public.plan_subscriptions USING btree (payment_id);
CREATE INDEX idx_plan_subscriptions_plan_id ON public.plan_subscriptions USING btree (plan_id);
CREATE INDEX idx_plan_subscriptions_user_id ON public.plan_subscriptions USING btree (user_id);


-- public.user_preferences definition

-- Drop table

-- DROP TABLE public.user_preferences;

CREATE TABLE public.user_preferences (
	user_id uuid NOT NULL,
	"language" text DEFAULT 'en'::text NOT NULL,
	locale text DEFAULT 'en'::text NOT NULL,
	email_notifications bool DEFAULT true NOT NULL,
	push_notifications bool DEFAULT true NOT NULL,
	marketing_notifications bool DEFAULT false NOT NULL,
	telegram_notifications bool DEFAULT false NOT NULL,
	created_at timestamptz NULL,
	updated_at timestamptz NULL,
	"version" int8 DEFAULT 1 NOT NULL,
	CONSTRAINT user_preferences_pkey PRIMARY KEY (user_id)
);


-- public.wallet_transactions definition

-- Drop table

-- DROP TABLE public.wallet_transactions;

CREATE TABLE public.wallet_transactions (
	id uuid NOT NULL,
	user_id uuid NOT NULL,
	"type" varchar(50) NOT NULL,
	amount numeric(65, 30) NOT NULL,
	currency text DEFAULT 'USD'::text NOT NULL,
	note text NULL,
	created_at timestamptz NULL,
	updated_at timestamptz NULL,
	payment_id uuid NULL,
	plan_id uuid NULL,
	term_months int4 NULL,
	"version" int8 DEFAULT 1 NOT NULL,
	CONSTRAINT wallet_transactions_pkey PRIMARY KEY (id)
);
CREATE INDEX idx_wallet_transactions_payment_id ON public.wallet_transactions USING btree (payment_id);
CREATE INDEX idx_wallet_transactions_plan_id ON public.wallet_transactions USING btree (plan_id);
CREATE INDEX idx_wallet_transactions_user_id ON public.wallet_transactions USING btree (user_id);


-- public."user" definition

-- Drop table

-- DROP TABLE public."user";

CREATE TABLE public."user" (
	id uuid DEFAULT gen_random_uuid() NOT NULL,
	email text NOT NULL,
	"password" text NULL,
	username text NULL,
	avatar text NULL,
	"role" varchar(20) DEFAULT 'USER'::character varying NOT NULL,
	google_id text NULL,
	storage_used int8 DEFAULT 0 NOT NULL,
	plan_id uuid NULL,
	created_at timestamp(3) DEFAULT CURRENT_TIMESTAMP NOT NULL,
	updated_at timestamp(3) NOT NULL,
	"version" int8 DEFAULT 1 NOT NULL,
	telegram_id varchar NULL,
	referred_by_user_id uuid NULL,
	referral_eligible bool DEFAULT true NOT NULL,
	referral_reward_bps int4 NULL,
	referral_reward_granted_at timestamptz NULL,
	referral_reward_payment_id uuid NULL,
	referral_reward_amount numeric(65, 30) NULL,
	CONSTRAINT user_pkey PRIMARY KEY (id),
	CONSTRAINT user_plan_id_fkey FOREIGN KEY (plan_id) REFERENCES public."plan"(id) ON DELETE SET NULL ON UPDATE CASCADE,
	CONSTRAINT user_referred_by_user_id_fkey FOREIGN KEY (referred_by_user_id) REFERENCES public."user"(id) ON DELETE SET NULL
);
CREATE INDEX idx_user_referred_by_user_id ON public."user" USING btree (referred_by_user_id);
CREATE UNIQUE INDEX user_email_key ON public."user" USING btree (email);
CREATE UNIQUE INDEX user_google_id_key ON public."user" USING btree (google_id);


-- public.video definition

-- Drop table

-- DROP TABLE public.video;

CREATE TABLE public.video (
	id uuid DEFAULT gen_random_uuid() NOT NULL,
	"name" text NOT NULL,
	title text NOT NULL,
	description text NULL,
	url text NOT NULL,
	thumbnail text NULL,
	hls_token text NULL,
	hls_path text NULL,
	duration int4 NOT NULL,
	"size" int8 NOT NULL,
	storage_type varchar(20) DEFAULT 'tiktok_avatar'::character varying NOT NULL,
	format text NOT NULL,
	status varchar(20) DEFAULT 'PUBLIC'::character varying NOT NULL,
	processing_status varchar(20) DEFAULT 'PENDING'::character varying NOT NULL,
	"views" int4 DEFAULT 0 NOT NULL,
	user_id uuid NOT NULL,
	created_at timestamp(3) DEFAULT CURRENT_TIMESTAMP NOT NULL,
	updated_at timestamp(3) NOT NULL,
	"version" int8 DEFAULT 1 NOT NULL,
	ad_id uuid NULL,
	metadata jsonb NULL,
	CONSTRAINT video_pkey PRIMARY KEY (id),
	CONSTRAINT video_user_id_fkey FOREIGN KEY (user_id) REFERENCES public."user"(id) ON DELETE RESTRICT ON UPDATE CASCADE
);


-- public.payment definition

-- Drop table

-- DROP TABLE public.payment;

CREATE TABLE public.payment (
	id uuid DEFAULT gen_random_uuid() NOT NULL,
	user_id uuid NOT NULL,
	plan_id uuid NULL,
	amount numeric(65, 30) NOT NULL,
	currency text DEFAULT 'USD'::text NOT NULL,
	status varchar(20) DEFAULT 'PENDING'::character varying NOT NULL,
	provider varchar(20) DEFAULT 'STRIPE'::character varying NOT NULL,
	transaction_id text NULL,
	created_at timestamp(3) DEFAULT CURRENT_TIMESTAMP NOT NULL,
	updated_at timestamp(3) NOT NULL,
	"version" int8 DEFAULT 1 NOT NULL,
	CONSTRAINT payment_pkey PRIMARY KEY (id),
	CONSTRAINT payment_plan_id_fkey FOREIGN KEY (plan_id) REFERENCES public."plan"(id) ON DELETE SET NULL ON UPDATE CASCADE,
	CONSTRAINT payment_user_id_fkey FOREIGN KEY (user_id) REFERENCES public."user"(id) ON DELETE RESTRICT ON UPDATE CASCADE
);


-- public.player_configs definition

-- Drop table

-- DROP TABLE public.player_configs;

CREATE TABLE public.player_configs (
	id uuid DEFAULT gen_random_uuid() NOT NULL,
	user_id uuid NOT NULL,
	"name" text NOT NULL,
	description text NULL,
	autoplay bool DEFAULT false NOT NULL,
	"loop" bool DEFAULT false NOT NULL,
	muted bool DEFAULT false NOT NULL,
	show_controls bool DEFAULT true NOT NULL,
	pip bool DEFAULT true NOT NULL,
	airplay bool DEFAULT true NOT NULL,
	chromecast bool DEFAULT true NOT NULL,
	is_active bool DEFAULT true NOT NULL,
	is_default bool DEFAULT false NOT NULL,
	created_at timestamp(3) DEFAULT CURRENT_TIMESTAMP NOT NULL,
	updated_at timestamp(3) NOT NULL,
	"version" int8 DEFAULT 1 NOT NULL,
	encrytion_m3u8 bool DEFAULT true NOT NULL,
	logo_url varchar(500) NULL,
	CONSTRAINT player_configs_pkey PRIMARY KEY (id),
	CONSTRAINT player_configs_url_check CHECK (((logo_url)::text ~* '^https?://'::text)),
	CONSTRAINT player_configs_user_id_fkey FOREIGN KEY (user_id) REFERENCES public."user"(id) ON DELETE CASCADE
);
CREATE INDEX idx_player_configs_is_default ON public.player_configs USING btree (is_default);
CREATE UNIQUE INDEX idx_player_configs_one_default_per_user ON public.player_configs USING btree (user_id) WHERE (is_default = true);
CREATE INDEX idx_player_configs_user_default ON public.player_configs USING btree (user_id, is_default);
CREATE INDEX idx_player_configs_user_id ON public.player_configs USING btree (user_id);

-- Table Triggers

create trigger trg_update_player_configs before
update
    on
    public.player_configs for each row execute function update_player_configs_updated_at();


-- public.popup_ads definition

-- Drop table

-- DROP TABLE public.popup_ads;

CREATE TABLE public.popup_ads (
	id uuid NOT NULL,
	user_id uuid NOT NULL,
	"type" varchar(20) NOT NULL,
	"label" text NOT NULL,
	value text NOT NULL,
	is_active bool DEFAULT true NOT NULL,
	max_triggers_per_session int4 DEFAULT 3 NOT NULL,
	created_at timestamptz DEFAULT CURRENT_TIMESTAMP NULL,
	updated_at timestamptz NULL,
	"version" int8 DEFAULT 1 NOT NULL,
	CONSTRAINT popup_ads_pkey PRIMARY KEY (id),
	CONSTRAINT popup_ads_user_id_fkey FOREIGN KEY (user_id) REFERENCES public."user"(id) ON DELETE CASCADE
);
CREATE INDEX idx_popup_ads_user_active ON public.popup_ads USING btree (user_id, is_active);
CREATE INDEX idx_popup_ads_user_id ON public.popup_ads USING btree (user_id);



-- DROP FUNCTION public.update_player_configs_updated_at();

CREATE OR REPLACE FUNCTION public.update_player_configs_updated_at()
 RETURNS trigger
 LANGUAGE plpgsql
AS $function$
BEGIN
    NEW.updated_at = CURRENT_TIMESTAMP;
    NEW.version = OLD.version + 1;
    RETURN NEW;
END;
$function$
;