create extension if not exists "vector" with schema "public" ;

create extension if not exists "wrappers" with schema "public";

create type "public"."brain_type_enum" as enum ('doc', 'api', 'composite');

create sequence "public"."summaries_id_seq";

create sequence "public"."vectors_id_seq";

create table "public"."[REDACTED] (
    "brain_id" uuid,
    "method" character varying(255),
    "url" character varying(255),
    "params" json,
    "search_params" json,
    "secrets" json
);


create table "public"."api_keys" (
    "key_id" uuid not null default gen_random_uuid(),
    "user_id" uuid,
    "api_key" text,
    "creation_time" timestamp without time zone default CURRENT_TIMESTAMP,
    "deleted_time" timestamp without time zone,
    "is_active" boolean default true,
    "name" text default 'API_KEY'::text,
    "days" integer default 30,
    "only_chat" boolean default false
);


create table "public"."brain_subscription_invitations" (
    "brain_id" uuid not null,
    "email" character varying(255) not null,
    "rights" character varying(255)
);


create table "public"."brains" (
    "brain_id" uuid not null default gen_random_uuid(),
    "name" text,
    "status" text,
    "model" text,
    "max_tokens" integer,
    "temperature" double precision,
    "description" text,
    "prompt_id" uuid,
    "retrieval_algorithm" text,
    "last_update" timestamp without time zone default CURRENT_TIMESTAMP,
    "brain_type" brain_type_enum default 'doc'::brain_type_enum
);


create table "public"."brains_users" (
    "brain_id" uuid not null,
    "rights" character varying(255),
    "default_brain" boolean,
    "user_id" uuid
);


create table "public"."brains_vectors" (
    "brain_id" uuid not null,
    "rights" character varying(255),
    "file_sha1" text,
    "vector_id" uuid
);


create table "public"."chat_history" (
    "message_id" uuid not null default uuid_generate_v4(),
    "chat_id" uuid not null,
    "user_message" text,
    "assistant" text,
    "message_time" timestamp without time zone default CURRENT_TIMESTAMP,
    "brain_id" uuid,
    "prompt_id" uuid
);


create table "public"."chats" (
    "chat_id" uuid not null default uuid_generate_v4(),
    "user_id" uuid,
    "creation_time" timestamp without time zone default CURRENT_TIMESTAMP,
    "history" jsonb,
    "chat_name" text
);


create table "public"."composite_brain_connections" (
    "composite_brain_id" uuid not null,
    "connected_brain_id" uuid not null
);


create table "public"."knowledge" (
    "id" uuid not null default gen_random_uuid(),
    "file_name" text,
    "url" text,
    "brain_id" uuid not null,
    "extension" text not null
);


create table "public"."knowledge_vectors" (
    "knowledge_id" uuid not null,
    "vector_id" uuid not null,
    "embedding_model" text not null
);


create table "public"."migrations" (
    "name" character varying(255) not null,
    "executed_at" timestamp with time zone default CURRENT_TIMESTAMP
);


create table "public"."notifications" (
    "id" uuid not null default gen_random_uuid(),
    "datetime" timestamp without time zone default CURRENT_TIMESTAMP,
    "chat_id" uuid,
    "message" text,
    "action" character varying(255) not null,
    "status" character varying(255) not null
);


create table "public"."onboardings" (
    "user_id" uuid not null,
    "onboarding_a" boolean not null default true,
    "onboarding_b1" boolean not null default true,
    "onboarding_b2" boolean not null default true,
    "onboarding_b3" boolean not null default true,
    "creation_time" timestamp without time zone default CURRENT_TIMESTAMP
);


create table "public"."prompts" (
    "id" uuid not null default uuid_generate_v4(),
    "title" character varying(255),
    "content" text,
    "status" character varying(255) default 'private'::character varying
);


create table "public"."stats" (
    "time" timestamp without time zone,
    "chat" boolean,
    "embedding" boolean,
    "details" text,
    "metadata" jsonb,
    "id" integer generated always as identity not null
);


create table "public"."summaries" (
    "id" bigint not null default nextval('summaries_id_seq'::regclass),
    "content" text,
    "metadata" jsonb,
    "embedding" vector(1536),
    "document_id" uuid
);


create table "public"."user_daily_usage" (
    "user_id" uuid not null,
    "email" text,
    "date" text not null,
    "daily_requests_count" integer
);


create table "public"."user_identity" (
    "user_id" uuid not null,
    "openai_api_key" character varying(255)
);


create table "public"."user_settings" (
    "user_id" uuid not null,
    "models" jsonb default '["gpt-3.5-turbo-1106"]'::jsonb,
    "daily_chat_credit" integer default 20,
    "max_brains" integer default 3,
    "max_brain_size" integer default 1000000
);


create table "public"."users" (
    "id" uuid not null,
    "email" text
);


create table "public"."users_old" (
    "user_id" uuid,
    "email" text,
    "date" text,
    "requests_count" integer,
    "supabase_id" uuid
);


create table "public"."vectors" (
    "id" uuid not null default uuid_generate_v4(),
    "content" text,
    "file_sha1" text,
    "metadata" jsonb,
    "embedding" vector(1536)
);


create table "public"."vectors_old" (
    "id" bigint not null default nextval('vectors_id_seq'::regclass),
    "content" text,
    "metadata" jsonb,
    "embedding" vector(1536)
);


alter sequence "public"."summaries_id_seq" owned by "public"."summaries"."id";

alter sequence "public"."vectors_id_seq" owned by "public"."vectors_old"."id";

CREATE UNIQUE INDEX [REDACTED]ON public.api_keys USING btree (api_key);

CREATE UNIQUE INDEX api_keys_pkey ON public.api_keys USING btree (key_id);

CREATE UNIQUE INDEX brain_subscription_invitations_pkey ON public.brain_subscription_invitations USING btree (brain_id, email);

CREATE UNIQUE INDEX brains_pkey ON public.brains USING btree (brain_id);

CREATE UNIQUE INDEX chat_history_pkey ON public.chat_history USING btree (chat_id, message_id);

CREATE UNIQUE INDEX chats_pkey ON public.chats USING btree (chat_id);

CREATE UNIQUE INDEX composite_brain_connections_pkey ON public.composite_brain_connections USING btree (composite_brain_id, connected_brain_id);

CREATE UNIQUE INDEX knowledge_pkey ON public.knowledge USING btree (id);

CREATE UNIQUE INDEX knowledge_vectors_pkey ON public.knowledge_vectors USING btree (knowledge_id, vector_id, embedding_model);

CREATE UNIQUE INDEX migrations_pkey ON public.migrations USING btree (name);

CREATE UNIQUE INDEX notifications_pkey ON public.notifications USING btree (id);

CREATE UNIQUE INDEX onboardings_pkey ON public.onboardings USING btree (user_id);

CREATE UNIQUE INDEX prompts_pkey ON public.prompts USING btree (id);

CREATE UNIQUE INDEX stats_pkey ON public.stats USING btree (id);

CREATE UNIQUE INDEX summaries_pkey ON public.summaries USING btree (id);

CREATE UNIQUE INDEX user_daily_usage_pkey ON public.user_daily_usage USING btree (user_id, date);

CREATE UNIQUE INDEX user_identity_pkey ON public.user_identity USING btree (user_id);

CREATE UNIQUE INDEX user_settings_pkey ON public.user_settings USING btree (user_id);

CREATE UNIQUE INDEX users_pkey ON public.users USING btree (id);

CREATE UNIQUE INDEX vectors_pkey ON public.vectors_old USING btree (id);

CREATE UNIQUE INDEX vectors_pkey1 ON public.vectors USING btree (id);

alter table "public"."api_keys" add constraint "api_keys_pkey" PRIMARY KEY using index "api_keys_pkey";

alter table "public"."brain_subscription_invitations" add constraint "brain_subscription_invitations_pkey" PRIMARY KEY using index "brain_subscription_invitations_pkey";

alter table "public"."brains" add constraint "brains_pkey" PRIMARY KEY using index "brains_pkey";

alter table "public"."chat_history" add constraint "chat_history_pkey" PRIMARY KEY using index "chat_history_pkey";

alter table "public"."chats" add constraint "chats_pkey" PRIMARY KEY using index "chats_pkey";

alter table "public"."composite_brain_connections" add constraint "composite_brain_connections_pkey" PRIMARY KEY using index "composite_brain_connections_pkey";

alter table "public"."knowledge" add constraint "knowledge_pkey" PRIMARY KEY using index "knowledge_pkey";

alter table "public"."knowledge_vectors" add constraint "knowledge_vectors_pkey" PRIMARY KEY using index "knowledge_vectors_pkey";

alter table "public"."migrations" add constraint "migrations_pkey" PRIMARY KEY using index "migrations_pkey";

alter table "public"."notifications" add constraint "notifications_pkey" PRIMARY KEY using index "notifications_pkey";

alter table "public"."onboardings" add constraint "onboardings_pkey" PRIMARY KEY using index "onboardings_pkey";

alter table "public"."prompts" add constraint "prompts_pkey" PRIMARY KEY using index "prompts_pkey";

alter table "public"."stats" add constraint "stats_pkey" PRIMARY KEY using index "stats_pkey";

alter table "public"."summaries" add constraint "summaries_pkey" PRIMARY KEY using index "summaries_pkey";

alter table "public"."user_daily_usage" add constraint "user_daily_usage_pkey" PRIMARY KEY using index "user_daily_usage_pkey";

alter table "public"."user_identity" add constraint "user_identity_pkey" PRIMARY KEY using index "user_identity_pkey";

alter table "public"."user_settings" add constraint "user_settings_pkey" PRIMARY KEY using index "user_settings_pkey";

alter table "public"."users" add constraint "users_pkey" PRIMARY KEY using index "users_pkey";

alter table "public"."vectors" add constraint "vectors_pkey1" PRIMARY KEY using index "vectors_pkey1";

alter table "public"."vectors_old" add constraint "vectors_pkey" PRIMARY KEY using index "vectors_pkey";

alter table "public"."[REDACTED] add constraint "[REDACTED] FOREIGN KEY (brain_id) REFERENCES brains(brain_id) not valid;

alter table "public"."[REDACTED] validate constraint "[REDACTED];

alter table "public"."[REDACTED] add constraint "[REDACTED] CHECK (((method)::text = ANY ((ARRAY['GET'::character varying, 'POST'::character varying, 'PUT'::character varying, 'DELETE'::character varying])::text[]))) not valid;

alter table "public"."[REDACTED] validate constraint "[REDACTED];

alter table "public"."api_keys" add constraint "[REDACTED] UNIQUE using index "[REDACTED];

alter table "public"."brain_subscription_invitations" add constraint "brain_subscription_invitations_brain_id_fkey" FOREIGN KEY (brain_id) REFERENCES brains(brain_id) not valid;

alter table "public"."brain_subscription_invitations" validate constraint "brain_subscription_invitations_brain_id_fkey";

alter table "public"."brains" add constraint "brains_prompt_id_fkey" FOREIGN KEY (prompt_id) REFERENCES prompts(id) not valid;

alter table "public"."brains" validate constraint "brains_prompt_id_fkey";

alter table "public"."brains_users" add constraint "brains_users_brain_id_fkey" FOREIGN KEY (brain_id) REFERENCES brains(brain_id) not valid;

alter table "public"."brains_users" validate constraint "brains_users_brain_id_fkey";

alter table "public"."brains_users" add constraint "brains_users_user_id_fkey" FOREIGN KEY (user_id) REFERENCES auth.users(id) not valid;

alter table "public"."brains_users" validate constraint "brains_users_user_id_fkey";

alter table "public"."brains_vectors" add constraint "brains_vectors_brain_id_fkey" FOREIGN KEY (brain_id) REFERENCES brains(brain_id) not valid;

alter table "public"."brains_vectors" validate constraint "brains_vectors_brain_id_fkey";

alter table "public"."chat_history" add constraint "chat_history_brain_id_fkey" FOREIGN KEY (brain_id) REFERENCES brains(brain_id) not valid;

alter table "public"."chat_history" validate constraint "chat_history_brain_id_fkey";

alter table "public"."chat_history" add constraint "chat_history_chat_id_fkey" FOREIGN KEY (chat_id) REFERENCES chats(chat_id) not valid;

alter table "public"."chat_history" validate constraint "chat_history_chat_id_fkey";

alter table "public"."chat_history" add constraint "chat_history_prompt_id_fkey" FOREIGN KEY (prompt_id) REFERENCES prompts(id) not valid;

alter table "public"."chat_history" validate constraint "chat_history_prompt_id_fkey";

alter table "public"."chats" add constraint "chats_user_id_fkey" FOREIGN KEY (user_id) REFERENCES auth.users(id) not valid;

alter table "public"."chats" validate constraint "chats_user_id_fkey";

alter table "public"."composite_brain_connections" add constraint "composite_brain_connections_check" CHECK ((composite_brain_id <> connected_brain_id)) not valid;

alter table "public"."composite_brain_connections" validate constraint "composite_brain_connections_check";

alter table "public"."composite_brain_connections" add constraint "composite_brain_connections_composite_brain_id_fkey" FOREIGN KEY (composite_brain_id) REFERENCES brains(brain_id) not valid;

alter table "public"."composite_brain_connections" validate constraint "composite_brain_connections_composite_brain_id_fkey";

alter table "public"."composite_brain_connections" add constraint "composite_brain_connections_connected_brain_id_fkey" FOREIGN KEY (connected_brain_id) REFERENCES brains(brain_id) not valid;

alter table "public"."composite_brain_connections" validate constraint "composite_brain_connections_connected_brain_id_fkey";

alter table "public"."knowledge" add constraint "knowledge_brain_id_fkey" FOREIGN KEY (brain_id) REFERENCES brains(brain_id) not valid;

alter table "public"."knowledge" validate constraint "knowledge_brain_id_fkey";

alter table "public"."knowledge" add constraint "knowledge_check" CHECK ((((file_name IS NOT NULL) AND (url IS NULL)) OR ((file_name IS NULL) AND (url IS NOT NULL)))) not valid;

alter table "public"."knowledge" validate constraint "knowledge_check";

alter table "public"."knowledge_vectors" add constraint "knowledge_vectors_knowledge_id_fkey" FOREIGN KEY (knowledge_id) REFERENCES knowledge(id) not valid;

alter table "public"."knowledge_vectors" validate constraint "knowledge_vectors_knowledge_id_fkey";

alter table "public"."notifications" add constraint "notifications_chat_id_fkey" FOREIGN KEY (chat_id) REFERENCES chats(chat_id) not valid;

alter table "public"."notifications" validate constraint "notifications_chat_id_fkey";

alter table "public"."onboardings" add constraint "onboardings_user_id_fkey" FOREIGN KEY (user_id) REFERENCES auth.users(id) not valid;

alter table "public"."onboardings" validate constraint "onboardings_user_id_fkey";

alter table "public"."user_daily_usage" add constraint "user_daily_usage_user_id_fkey" FOREIGN KEY (user_id) REFERENCES auth.users(id) not valid;

alter table "public"."user_daily_usage" validate constraint "user_daily_usage_user_id_fkey";

alter table "public"."users" add constraint "users_id_fkey" FOREIGN KEY (id) REFERENCES auth.users(id) not valid;

alter table "public"."users" validate constraint "users_id_fkey";

set check_function_bodies = off;

CREATE OR REPLACE FUNCTION public.create_user_onboarding()
 RETURNS trigger
 LANGUAGE plpgsql
 SECURITY DEFINER
AS $function$
BEGIN
    INSERT INTO public.onboardings (user_id)
    VALUES (NEW.id);
    RETURN NEW;
END;
$function$
;

CREATE OR REPLACE FUNCTION public.delete_secret(secret_name text)
 RETURNS text
 LANGUAGE plpgsql
 SECURITY DEFINER
 SET search_path TO 'public'
AS $function$
declare
 deleted_rows int;
begin
 delete from vault.decrypted_secrets where name = secret_name;
 get diagnostics deleted_rows = row_count;
 if deleted_rows = 0 then
   return false;
 else
   return true;
 end if;
end;
$function$
;

CREATE OR REPLACE FUNCTION public.get_premium_user(input_email text)
 RETURNS TABLE(email text)
 LANGUAGE plpgsql
AS $function$
BEGIN
RETURN QUERY
SELECT  c.email
FROM stripe.customers c
WHERE c.email = input_email;
END;
$function$
;

CREATE OR REPLACE FUNCTION public.get_user_email_by_user_id(user_id uuid)
 RETURNS TABLE(email text)
 LANGUAGE plpgsql
 SECURITY DEFINER
AS $function$
BEGIN
  RETURN QUERY SELECT au.email::text FROM auth.users au WHERE au.id = user_id;
END;
$function$
;

CREATE OR REPLACE FUNCTION public.handle_new_user()
 RETURNS trigger
 LANGUAGE plpgsql
 SECURITY DEFINER
AS $function$
BEGIN
  INSERT INTO public.users (id, email)
  VALUES (NEW.id, NEW.email);
  RETURN NEW;
END;
$function$
;

CREATE OR REPLACE FUNCTION public.insert_secret(name text, secret text)
 RETURNS uuid
 LANGUAGE plpgsql
 SECURITY DEFINER
 SET search_path TO 'public'
AS $function$
begin
  return vault.create_secret(secret, name);
end;
$function$
;

CREATE OR REPLACE FUNCTION public.match_vectors(query_embedding vector, match_count integer, p_brain_id uuid)
 RETURNS TABLE(id uuid, brain_id uuid, content text, metadata jsonb, embedding vector, similarity double precision)
 LANGUAGE plpgsql
AS $function$
#variable_conflict use_column
BEGIN
    RETURN QUERY
    SELECT
        vectors.id,
        brains_vectors.brain_id,
        vectors.content,
        vectors.metadata,
        vectors.embedding,
        1 - (vectors.embedding <=> query_embedding) AS similarity
    FROM
        vectors
    INNER JOIN
        brains_vectors ON vectors.id = brains_vectors.vector_id
    WHERE brains_vectors.brain_id = p_brain_id
    ORDER BY
        vectors.embedding <=> query_embedding
    LIMIT match_count;
END;
$function$
;

CREATE OR REPLACE FUNCTION public.read_secret(secret_name text)
 RETURNS text
 LANGUAGE plpgsql
 SECURITY DEFINER
 SET search_path TO 'public'
AS $function$
declare
  secret text;
begin
  select decrypted_secret from vault.decrypted_secrets where name =
  secret_name into secret;
  return secret;
end;
$function$
;

CREATE OR REPLACE FUNCTION public.update_max_brains()
 RETURNS trigger
 LANGUAGE plpgsql
 SECURITY DEFINER
AS $function$
DECLARE
    userEmail TEXT;
BEGIN
    SELECT email INTO userEmail FROM auth.users WHERE id = NEW.user_id;

    IF userEmail LIKE '%@theodo.fr' THEN
        -- Ensure the models column is initialized as an array if null
        IF NEW.models IS NULL THEN
            NEW.models := '[]'::jsonb;
        END IF;

        -- Add gpt-4 if not present
        IF NOT NEW.models ? 'gpt-4' THEN
            NEW.models := NEW.models || '["gpt-4"]'::jsonb;
        END IF;

        -- Add gpt-3.5-turbo if not present
        IF NOT NEW.models ? 'gpt-3.5-turbo' THEN
            NEW.models := NEW.models || '["gpt-3.5-turbo"]'::jsonb;
        END IF;

        -- Add gpt-3.5-turbo-16k if not present
        IF NOT NEW.models ? 'gpt-3.5-turbo-16k' THEN
            NEW.models := NEW.models || '["gpt-3.5-turbo-16k"]'::jsonb;
        END IF;

        UPDATE user_settings
        SET 
            max_brains = 30,
            max_brain_size = 10000000,
            models = NEW.models
        WHERE user_id = NEW.user_id;
    END IF;

    RETURN NULL;  -- for AFTER triggers, the return value is ignored
END;
$function$
;

CREATE OR REPLACE FUNCTION public.update_max_brains_theodo()
 RETURNS trigger
 LANGUAGE plpgsql
 SECURITY DEFINER
AS $function$
DECLARE
    userEmail TEXT;
    allowedDomains TEXT[] := ARRAY['@theodo.fr', '@theodo.com', '@theodo.co.uk', '@bam.tech', '@padok.fr', '@sicara.fr', '@hokla.com', '@sipios.com'];
BEGIN
    SELECT email INTO userEmail FROM auth.users WHERE id = NEW.user_id;

    IF userEmail LIKE ANY(allowedDomains) THEN
        -- Ensure the models column is initialized as an array if null
        IF NEW.models IS NULL THEN
            NEW.models := '[]'::jsonb;
        END IF;

        -- Add gpt-4 if not present
        IF NOT NEW.models ? 'gpt-4' THEN
            NEW.models := NEW.models || '["gpt-4"]'::jsonb;
        END IF;

        -- Add gpt-3.5-turbo if not present
        IF NOT NEW.models ? 'gpt-3.5-turbo' THEN
            NEW.models := NEW.models || '["gpt-3.5-turbo"]'::jsonb;
        END IF;

        -- Add gpt-3.5-turbo-16k if not present
        IF NOT NEW.models ? 'gpt-3.5-turbo-16k' THEN
            NEW.models := NEW.models || '["gpt-3.5-turbo-16k"]'::jsonb;
        END IF;

        UPDATE user_settings
        SET 
            max_brains = 30,
            max_brain_size = 100000000,

            models = NEW.models
        WHERE user_id = NEW.user_id;
    END IF;

    RETURN NULL;  -- for AFTER triggers, the return value is ignored
END;
$function$
;

CREATE OR REPLACE FUNCTION public.update_user_settings()
 RETURNS trigger
 LANGUAGE plpgsql
AS $function$
BEGIN
    IF NEW.email LIKE '%@theodo.fr' THEN
        -- This checks if the models key is present and is of type jsonb array, 
        -- if not it initializes it with an empty array.
        IF NEW.models IS NULL OR NOT jsonb_typeof(NEW.models) = 'array' THEN
            NEW.models := '[]'::jsonb;
        END IF;

        -- Append new values to the JSONB array. 
        -- This does not check for duplicates, so you might get repeated values.
        NEW.models := NEW.models || '["gpt-4", "gpt-3.5-turbo"]'::jsonb;
    END IF;
    RETURN NEW;
END;
$function$
;

grant delete on table "public"."[REDACTED] to "anon";

grant insert on table "public"."[REDACTED] to "anon";

grant references on table "public"."[REDACTED] to "anon";

grant select on table "public"."[REDACTED] to "anon";

grant trigger on table "public"."[REDACTED] to "anon";

grant truncate on table "public"."[REDACTED] to "anon";

grant update on table "public"."[REDACTED] to "anon";

grant delete on table "public"."[REDACTED] to "authenticated";

grant insert on table "public"."[REDACTED] to "authenticated";

grant references on table "public"."[REDACTED] to "authenticated";

grant select on table "public"."[REDACTED] to "authenticated";

grant trigger on table "public"."[REDACTED] to "authenticated";

grant truncate on table "public"."[REDACTED] to "authenticated";

grant update on table "public"."[REDACTED] to "authenticated";

grant delete on table "public"."[REDACTED] to "service_role";

grant insert on table "public"."[REDACTED] to "service_role";

grant references on table "public"."[REDACTED] to "service_role";

grant select on table "public"."[REDACTED] to "service_role";

grant trigger on table "public"."[REDACTED] to "service_role";

grant truncate on table "public"."[REDACTED] to "service_role";

grant update on table "public"."[REDACTED] to "service_role";

grant delete on table "public"."api_keys" to "anon";

grant insert on table "public"."api_keys" to "anon";

grant references on table "public"."api_keys" to "anon";

grant select on table "public"."api_keys" to "anon";

grant trigger on table "public"."api_keys" to "anon";

grant truncate on table "public"."api_keys" to "anon";

grant update on table "public"."api_keys" to "anon";

grant delete on table "public"."api_keys" to "authenticated";

grant insert on table "public"."api_keys" to "authenticated";

grant references on table "public"."api_keys" to "authenticated";

grant select on table "public"."api_keys" to "authenticated";

grant trigger on table "public"."api_keys" to "authenticated";

grant truncate on table "public"."api_keys" to "authenticated";

grant update on table "public"."api_keys" to "authenticated";

grant delete on table "public"."api_keys" to "service_role";

grant insert on table "public"."api_keys" to "service_role";

grant references on table "public"."api_keys" to "service_role";

grant select on table "public"."api_keys" to "service_role";

grant trigger on table "public"."api_keys" to "service_role";

grant truncate on table "public"."api_keys" to "service_role";

grant update on table "public"."api_keys" to "service_role";

grant delete on table "public"."brain_subscription_invitations" to "anon";

grant insert on table "public"."brain_subscription_invitations" to "anon";

grant references on table "public"."brain_subscription_invitations" to "anon";

grant select on table "public"."brain_subscription_invitations" to "anon";

grant trigger on table "public"."brain_subscription_invitations" to "anon";

grant truncate on table "public"."brain_subscription_invitations" to "anon";

grant update on table "public"."brain_subscription_invitations" to "anon";

grant delete on table "public"."brain_subscription_invitations" to "authenticated";

grant insert on table "public"."brain_subscription_invitations" to "authenticated";

grant references on table "public"."brain_subscription_invitations" to "authenticated";

grant select on table "public"."brain_subscription_invitations" to "authenticated";

grant trigger on table "public"."brain_subscription_invitations" to "authenticated";

grant truncate on table "public"."brain_subscription_invitations" to "authenticated";

grant update on table "public"."brain_subscription_invitations" to "authenticated";

grant delete on table "public"."brain_subscription_invitations" to "service_role";

grant insert on table "public"."brain_subscription_invitations" to "service_role";

grant references on table "public"."brain_subscription_invitations" to "service_role";

grant select on table "public"."brain_subscription_invitations" to "service_role";

grant trigger on table "public"."brain_subscription_invitations" to "service_role";

grant truncate on table "public"."brain_subscription_invitations" to "service_role";

grant update on table "public"."brain_subscription_invitations" to "service_role";

grant delete on table "public"."brains" to "anon";

grant insert on table "public"."brains" to "anon";

grant references on table "public"."brains" to "anon";

grant select on table "public"."brains" to "anon";

grant trigger on table "public"."brains" to "anon";

grant truncate on table "public"."brains" to "anon";

grant update on table "public"."brains" to "anon";

grant delete on table "public"."brains" to "authenticated";

grant insert on table "public"."brains" to "authenticated";

grant references on table "public"."brains" to "authenticated";

grant select on table "public"."brains" to "authenticated";

grant trigger on table "public"."brains" to "authenticated";

grant truncate on table "public"."brains" to "authenticated";

grant update on table "public"."brains" to "authenticated";

grant delete on table "public"."brains" to "service_role";

grant insert on table "public"."brains" to "service_role";

grant references on table "public"."brains" to "service_role";

grant select on table "public"."brains" to "service_role";

grant trigger on table "public"."brains" to "service_role";

grant truncate on table "public"."brains" to "service_role";

grant update on table "public"."brains" to "service_role";

grant delete on table "public"."brains_users" to "anon";

grant insert on table "public"."brains_users" to "anon";

grant references on table "public"."brains_users" to "anon";

grant select on table "public"."brains_users" to "anon";

grant trigger on table "public"."brains_users" to "anon";

grant truncate on table "public"."brains_users" to "anon";

grant update on table "public"."brains_users" to "anon";

grant delete on table "public"."brains_users" to "authenticated";

grant insert on table "public"."brains_users" to "authenticated";

grant references on table "public"."brains_users" to "authenticated";

grant select on table "public"."brains_users" to "authenticated";

grant trigger on table "public"."brains_users" to "authenticated";

grant truncate on table "public"."brains_users" to "authenticated";

grant update on table "public"."brains_users" to "authenticated";

grant delete on table "public"."brains_users" to "service_role";

grant insert on table "public"."brains_users" to "service_role";

grant references on table "public"."brains_users" to "service_role";

grant select on table "public"."brains_users" to "service_role";

grant trigger on table "public"."brains_users" to "service_role";

grant truncate on table "public"."brains_users" to "service_role";

grant update on table "public"."brains_users" to "service_role";

grant delete on table "public"."brains_vectors" to "anon";

grant insert on table "public"."brains_vectors" to "anon";

grant references on table "public"."brains_vectors" to "anon";

grant select on table "public"."brains_vectors" to "anon";

grant trigger on table "public"."brains_vectors" to "anon";

grant truncate on table "public"."brains_vectors" to "anon";

grant update on table "public"."brains_vectors" to "anon";

grant delete on table "public"."brains_vectors" to "authenticated";

grant insert on table "public"."brains_vectors" to "authenticated";

grant references on table "public"."brains_vectors" to "authenticated";

grant select on table "public"."brains_vectors" to "authenticated";

grant trigger on table "public"."brains_vectors" to "authenticated";

grant truncate on table "public"."brains_vectors" to "authenticated";

grant update on table "public"."brains_vectors" to "authenticated";

grant delete on table "public"."brains_vectors" to "service_role";

grant insert on table "public"."brains_vectors" to "service_role";

grant references on table "public"."brains_vectors" to "service_role";

grant select on table "public"."brains_vectors" to "service_role";

grant trigger on table "public"."brains_vectors" to "service_role";

grant truncate on table "public"."brains_vectors" to "service_role";

grant update on table "public"."brains_vectors" to "service_role";

grant delete on table "public"."chat_history" to "anon";

grant insert on table "public"."chat_history" to "anon";

grant references on table "public"."chat_history" to "anon";

grant select on table "public"."chat_history" to "anon";

grant trigger on table "public"."chat_history" to "anon";

grant truncate on table "public"."chat_history" to "anon";

grant update on table "public"."chat_history" to "anon";

grant delete on table "public"."chat_history" to "authenticated";

grant insert on table "public"."chat_history" to "authenticated";

grant references on table "public"."chat_history" to "authenticated";

grant select on table "public"."chat_history" to "authenticated";

grant trigger on table "public"."chat_history" to "authenticated";

grant truncate on table "public"."chat_history" to "authenticated";

grant update on table "public"."chat_history" to "authenticated";

grant delete on table "public"."chat_history" to "service_role";

grant insert on table "public"."chat_history" to "service_role";

grant references on table "public"."chat_history" to "service_role";

grant select on table "public"."chat_history" to "service_role";

grant trigger on table "public"."chat_history" to "service_role";

grant truncate on table "public"."chat_history" to "service_role";

grant update on table "public"."chat_history" to "service_role";

grant delete on table "public"."chats" to "anon";

grant insert on table "public"."chats" to "anon";

grant references on table "public"."chats" to "anon";

grant select on table "public"."chats" to "anon";

grant trigger on table "public"."chats" to "anon";

grant truncate on table "public"."chats" to "anon";

grant update on table "public"."chats" to "anon";

grant delete on table "public"."chats" to "authenticated";

grant insert on table "public"."chats" to "authenticated";

grant references on table "public"."chats" to "authenticated";

grant select on table "public"."chats" to "authenticated";

grant trigger on table "public"."chats" to "authenticated";

grant truncate on table "public"."chats" to "authenticated";

grant update on table "public"."chats" to "authenticated";

grant delete on table "public"."chats" to "service_role";

grant insert on table "public"."chats" to "service_role";

grant references on table "public"."chats" to "service_role";

grant select on table "public"."chats" to "service_role";

grant trigger on table "public"."chats" to "service_role";

grant truncate on table "public"."chats" to "service_role";

grant update on table "public"."chats" to "service_role";

grant delete on table "public"."composite_brain_connections" to "anon";

grant insert on table "public"."composite_brain_connections" to "anon";

grant references on table "public"."composite_brain_connections" to "anon";

grant select on table "public"."composite_brain_connections" to "anon";

grant trigger on table "public"."composite_brain_connections" to "anon";

grant truncate on table "public"."composite_brain_connections" to "anon";

grant update on table "public"."composite_brain_connections" to "anon";

grant delete on table "public"."composite_brain_connections" to "authenticated";

grant insert on table "public"."composite_brain_connections" to "authenticated";

grant references on table "public"."composite_brain_connections" to "authenticated";

grant select on table "public"."composite_brain_connections" to "authenticated";

grant trigger on table "public"."composite_brain_connections" to "authenticated";

grant truncate on table "public"."composite_brain_connections" to "authenticated";

grant update on table "public"."composite_brain_connections" to "authenticated";

grant delete on table "public"."composite_brain_connections" to "service_role";

grant insert on table "public"."composite_brain_connections" to "service_role";

grant references on table "public"."composite_brain_connections" to "service_role";

grant select on table "public"."composite_brain_connections" to "service_role";

grant trigger on table "public"."composite_brain_connections" to "service_role";

grant truncate on table "public"."composite_brain_connections" to "service_role";

grant update on table "public"."composite_brain_connections" to "service_role";

grant delete on table "public"."knowledge" to "anon";

grant insert on table "public"."knowledge" to "anon";

grant references on table "public"."knowledge" to "anon";

grant select on table "public"."knowledge" to "anon";

grant trigger on table "public"."knowledge" to "anon";

grant truncate on table "public"."knowledge" to "anon";

grant update on table "public"."knowledge" to "anon";

grant delete on table "public"."knowledge" to "authenticated";

grant insert on table "public"."knowledge" to "authenticated";

grant references on table "public"."knowledge" to "authenticated";

grant select on table "public"."knowledge" to "authenticated";

grant trigger on table "public"."knowledge" to "authenticated";

grant truncate on table "public"."knowledge" to "authenticated";

grant update on table "public"."knowledge" to "authenticated";

grant delete on table "public"."knowledge" to "service_role";

grant insert on table "public"."knowledge" to "service_role";

grant references on table "public"."knowledge" to "service_role";

grant select on table "public"."knowledge" to "service_role";

grant trigger on table "public"."knowledge" to "service_role";

grant truncate on table "public"."knowledge" to "service_role";

grant update on table "public"."knowledge" to "service_role";

grant delete on table "public"."knowledge_vectors" to "anon";

grant insert on table "public"."knowledge_vectors" to "anon";

grant references on table "public"."knowledge_vectors" to "anon";

grant select on table "public"."knowledge_vectors" to "anon";

grant trigger on table "public"."knowledge_vectors" to "anon";

grant truncate on table "public"."knowledge_vectors" to "anon";

grant update on table "public"."knowledge_vectors" to "anon";

grant delete on table "public"."knowledge_vectors" to "authenticated";

grant insert on table "public"."knowledge_vectors" to "authenticated";

grant references on table "public"."knowledge_vectors" to "authenticated";

grant select on table "public"."knowledge_vectors" to "authenticated";

grant trigger on table "public"."knowledge_vectors" to "authenticated";

grant truncate on table "public"."knowledge_vectors" to "authenticated";

grant update on table "public"."knowledge_vectors" to "authenticated";

grant delete on table "public"."knowledge_vectors" to "service_role";

grant insert on table "public"."knowledge_vectors" to "service_role";

grant references on table "public"."knowledge_vectors" to "service_role";

grant select on table "public"."knowledge_vectors" to "service_role";

grant trigger on table "public"."knowledge_vectors" to "service_role";

grant truncate on table "public"."knowledge_vectors" to "service_role";

grant update on table "public"."knowledge_vectors" to "service_role";

grant delete on table "public"."migrations" to "anon";

grant insert on table "public"."migrations" to "anon";

grant references on table "public"."migrations" to "anon";

grant select on table "public"."migrations" to "anon";

grant trigger on table "public"."migrations" to "anon";

grant truncate on table "public"."migrations" to "anon";

grant update on table "public"."migrations" to "anon";

grant delete on table "public"."migrations" to "authenticated";

grant insert on table "public"."migrations" to "authenticated";

grant references on table "public"."migrations" to "authenticated";

grant select on table "public"."migrations" to "authenticated";

grant trigger on table "public"."migrations" to "authenticated";

grant truncate on table "public"."migrations" to "authenticated";

grant update on table "public"."migrations" to "authenticated";

grant delete on table "public"."migrations" to "service_role";

grant insert on table "public"."migrations" to "service_role";

grant references on table "public"."migrations" to "service_role";

grant select on table "public"."migrations" to "service_role";

grant trigger on table "public"."migrations" to "service_role";

grant truncate on table "public"."migrations" to "service_role";

grant update on table "public"."migrations" to "service_role";

grant delete on table "public"."notifications" to "anon";

grant insert on table "public"."notifications" to "anon";

grant references on table "public"."notifications" to "anon";

grant select on table "public"."notifications" to "anon";

grant trigger on table "public"."notifications" to "anon";

grant truncate on table "public"."notifications" to "anon";

grant update on table "public"."notifications" to "anon";

grant delete on table "public"."notifications" to "authenticated";

grant insert on table "public"."notifications" to "authenticated";

grant references on table "public"."notifications" to "authenticated";

grant select on table "public"."notifications" to "authenticated";

grant trigger on table "public"."notifications" to "authenticated";

grant truncate on table "public"."notifications" to "authenticated";

grant update on table "public"."notifications" to "authenticated";

grant delete on table "public"."notifications" to "service_role";

grant insert on table "public"."notifications" to "service_role";

grant references on table "public"."notifications" to "service_role";

grant select on table "public"."notifications" to "service_role";

grant trigger on table "public"."notifications" to "service_role";

grant truncate on table "public"."notifications" to "service_role";

grant update on table "public"."notifications" to "service_role";

grant delete on table "public"."onboardings" to "anon";

grant insert on table "public"."onboardings" to "anon";

grant references on table "public"."onboardings" to "anon";

grant select on table "public"."onboardings" to "anon";

grant trigger on table "public"."onboardings" to "anon";

grant truncate on table "public"."onboardings" to "anon";

grant update on table "public"."onboardings" to "anon";

grant delete on table "public"."onboardings" to "authenticated";

grant insert on table "public"."onboardings" to "authenticated";

grant references on table "public"."onboardings" to "authenticated";

grant select on table "public"."onboardings" to "authenticated";

grant trigger on table "public"."onboardings" to "authenticated";

grant truncate on table "public"."onboardings" to "authenticated";

grant update on table "public"."onboardings" to "authenticated";

grant delete on table "public"."onboardings" to "service_role";

grant insert on table "public"."onboardings" to "service_role";

grant references on table "public"."onboardings" to "service_role";

grant select on table "public"."onboardings" to "service_role";

grant trigger on table "public"."onboardings" to "service_role";

grant truncate on table "public"."onboardings" to "service_role";

grant update on table "public"."onboardings" to "service_role";

grant delete on table "public"."prompts" to "anon";

grant insert on table "public"."prompts" to "anon";

grant references on table "public"."prompts" to "anon";

grant select on table "public"."prompts" to "anon";

grant trigger on table "public"."prompts" to "anon";

grant truncate on table "public"."prompts" to "anon";

grant update on table "public"."prompts" to "anon";

grant delete on table "public"."prompts" to "authenticated";

grant insert on table "public"."prompts" to "authenticated";

grant references on table "public"."prompts" to "authenticated";

grant select on table "public"."prompts" to "authenticated";

grant trigger on table "public"."prompts" to "authenticated";

grant truncate on table "public"."prompts" to "authenticated";

grant update on table "public"."prompts" to "authenticated";

grant delete on table "public"."prompts" to "service_role";

grant insert on table "public"."prompts" to "service_role";

grant references on table "public"."prompts" to "service_role";

grant select on table "public"."prompts" to "service_role";

grant trigger on table "public"."prompts" to "service_role";

grant truncate on table "public"."prompts" to "service_role";

grant update on table "public"."prompts" to "service_role";

grant delete on table "public"."stats" to "anon";

grant insert on table "public"."stats" to "anon";

grant references on table "public"."stats" to "anon";

grant select on table "public"."stats" to "anon";

grant trigger on table "public"."stats" to "anon";

grant truncate on table "public"."stats" to "anon";

grant update on table "public"."stats" to "anon";

grant delete on table "public"."stats" to "authenticated";

grant insert on table "public"."stats" to "authenticated";

grant references on table "public"."stats" to "authenticated";

grant select on table "public"."stats" to "authenticated";

grant trigger on table "public"."stats" to "authenticated";

grant truncate on table "public"."stats" to "authenticated";

grant update on table "public"."stats" to "authenticated";

grant delete on table "public"."stats" to "service_role";

grant insert on table "public"."stats" to "service_role";

grant references on table "public"."stats" to "service_role";

grant select on table "public"."stats" to "service_role";

grant trigger on table "public"."stats" to "service_role";

grant truncate on table "public"."stats" to "service_role";

grant update on table "public"."stats" to "service_role";

grant delete on table "public"."summaries" to "anon";

grant insert on table "public"."summaries" to "anon";

grant references on table "public"."summaries" to "anon";

grant select on table "public"."summaries" to "anon";

grant trigger on table "public"."summaries" to "anon";

grant truncate on table "public"."summaries" to "anon";

grant update on table "public"."summaries" to "anon";

grant delete on table "public"."summaries" to "authenticated";

grant insert on table "public"."summaries" to "authenticated";

grant references on table "public"."summaries" to "authenticated";

grant select on table "public"."summaries" to "authenticated";

grant trigger on table "public"."summaries" to "authenticated";

grant truncate on table "public"."summaries" to "authenticated";

grant update on table "public"."summaries" to "authenticated";

grant delete on table "public"."summaries" to "service_role";

grant insert on table "public"."summaries" to "service_role";

grant references on table "public"."summaries" to "service_role";

grant select on table "public"."summaries" to "service_role";

grant trigger on table "public"."summaries" to "service_role";

grant truncate on table "public"."summaries" to "service_role";

grant update on table "public"."summaries" to "service_role";

grant delete on table "public"."user_daily_usage" to "anon";

grant insert on table "public"."user_daily_usage" to "anon";

grant references on table "public"."user_daily_usage" to "anon";

grant select on table "public"."user_daily_usage" to "anon";

grant trigger on table "public"."user_daily_usage" to "anon";

grant truncate on table "public"."user_daily_usage" to "anon";

grant update on table "public"."user_daily_usage" to "anon";

grant delete on table "public"."user_daily_usage" to "authenticated";

grant insert on table "public"."user_daily_usage" to "authenticated";

grant references on table "public"."user_daily_usage" to "authenticated";

grant select on table "public"."user_daily_usage" to "authenticated";

grant trigger on table "public"."user_daily_usage" to "authenticated";

grant truncate on table "public"."user_daily_usage" to "authenticated";

grant update on table "public"."user_daily_usage" to "authenticated";

grant delete on table "public"."user_daily_usage" to "service_role";

grant insert on table "public"."user_daily_usage" to "service_role";

grant references on table "public"."user_daily_usage" to "service_role";

grant select on table "public"."user_daily_usage" to "service_role";

grant trigger on table "public"."user_daily_usage" to "service_role";

grant truncate on table "public"."user_daily_usage" to "service_role";

grant update on table "public"."user_daily_usage" to "service_role";

grant delete on table "public"."user_identity" to "anon";

grant insert on table "public"."user_identity" to "anon";

grant references on table "public"."user_identity" to "anon";

grant select on table "public"."user_identity" to "anon";

grant trigger on table "public"."user_identity" to "anon";

grant truncate on table "public"."user_identity" to "anon";

grant update on table "public"."user_identity" to "anon";

grant delete on table "public"."user_identity" to "authenticated";

grant insert on table "public"."user_identity" to "authenticated";

grant references on table "public"."user_identity" to "authenticated";

grant select on table "public"."user_identity" to "authenticated";

grant trigger on table "public"."user_identity" to "authenticated";

grant truncate on table "public"."user_identity" to "authenticated";

grant update on table "public"."user_identity" to "authenticated";

grant delete on table "public"."user_identity" to "service_role";

grant insert on table "public"."user_identity" to "service_role";

grant references on table "public"."user_identity" to "service_role";

grant select on table "public"."user_identity" to "service_role";

grant trigger on table "public"."user_identity" to "service_role";

grant truncate on table "public"."user_identity" to "service_role";

grant update on table "public"."user_identity" to "service_role";

grant delete on table "public"."user_settings" to "anon";

grant insert on table "public"."user_settings" to "anon";

grant references on table "public"."user_settings" to "anon";

grant select on table "public"."user_settings" to "anon";

grant trigger on table "public"."user_settings" to "anon";

grant truncate on table "public"."user_settings" to "anon";

grant update on table "public"."user_settings" to "anon";

grant delete on table "public"."user_settings" to "authenticated";

grant insert on table "public"."user_settings" to "authenticated";

grant references on table "public"."user_settings" to "authenticated";

grant select on table "public"."user_settings" to "authenticated";

grant trigger on table "public"."user_settings" to "authenticated";

grant truncate on table "public"."user_settings" to "authenticated";

grant update on table "public"."user_settings" to "authenticated";

grant delete on table "public"."user_settings" to "service_role";

grant insert on table "public"."user_settings" to "service_role";

grant references on table "public"."user_settings" to "service_role";

grant select on table "public"."user_settings" to "service_role";

grant trigger on table "public"."user_settings" to "service_role";

grant truncate on table "public"."user_settings" to "service_role";

grant update on table "public"."user_settings" to "service_role";

grant delete on table "public"."users" to "anon";

grant insert on table "public"."users" to "anon";

grant references on table "public"."users" to "anon";

grant select on table "public"."users" to "anon";

grant trigger on table "public"."users" to "anon";

grant truncate on table "public"."users" to "anon";

grant update on table "public"."users" to "anon";

grant delete on table "public"."users" to "authenticated";

grant insert on table "public"."users" to "authenticated";

grant references on table "public"."users" to "authenticated";

grant select on table "public"."users" to "authenticated";

grant trigger on table "public"."users" to "authenticated";

grant truncate on table "public"."users" to "authenticated";

grant update on table "public"."users" to "authenticated";

grant delete on table "public"."users" to "service_role";

grant insert on table "public"."users" to "service_role";

grant references on table "public"."users" to "service_role";

grant select on table "public"."users" to "service_role";

grant trigger on table "public"."users" to "service_role";

grant truncate on table "public"."users" to "service_role";

grant update on table "public"."users" to "service_role";

grant delete on table "public"."users_old" to "anon";

grant insert on table "public"."users_old" to "anon";

grant references on table "public"."users_old" to "anon";

grant select on table "public"."users_old" to "anon";

grant trigger on table "public"."users_old" to "anon";

grant truncate on table "public"."users_old" to "anon";

grant update on table "public"."users_old" to "anon";

grant delete on table "public"."users_old" to "authenticated";

grant insert on table "public"."users_old" to "authenticated";

grant references on table "public"."users_old" to "authenticated";

grant select on table "public"."users_old" to "authenticated";

grant trigger on table "public"."users_old" to "authenticated";

grant truncate on table "public"."users_old" to "authenticated";

grant update on table "public"."users_old" to "authenticated";

grant delete on table "public"."users_old" to "service_role";

grant insert on table "public"."users_old" to "service_role";

grant references on table "public"."users_old" to "service_role";

grant select on table "public"."users_old" to "service_role";

grant trigger on table "public"."users_old" to "service_role";

grant truncate on table "public"."users_old" to "service_role";

grant update on table "public"."users_old" to "service_role";

grant delete on table "public"."vectors" to "anon";

grant insert on table "public"."vectors" to "anon";

grant references on table "public"."vectors" to "anon";

grant select on table "public"."vectors" to "anon";

grant trigger on table "public"."vectors" to "anon";

grant truncate on table "public"."vectors" to "anon";

grant update on table "public"."vectors" to "anon";

grant delete on table "public"."vectors" to "authenticated";

grant insert on table "public"."vectors" to "authenticated";

grant references on table "public"."vectors" to "authenticated";

grant select on table "public"."vectors" to "authenticated";

grant trigger on table "public"."vectors" to "authenticated";

grant truncate on table "public"."vectors" to "authenticated";

grant update on table "public"."vectors" to "authenticated";

grant delete on table "public"."vectors" to "service_role";

grant insert on table "public"."vectors" to "service_role";

grant references on table "public"."vectors" to "service_role";

grant select on table "public"."vectors" to "service_role";

grant trigger on table "public"."vectors" to "service_role";

grant truncate on table "public"."vectors" to "service_role";

grant update on table "public"."vectors" to "service_role";

grant delete on table "public"."vectors_old" to "anon";

grant insert on table "public"."vectors_old" to "anon";

grant references on table "public"."vectors_old" to "anon";

grant select on table "public"."vectors_old" to "anon";

grant trigger on table "public"."vectors_old" to "anon";

grant truncate on table "public"."vectors_old" to "anon";

grant update on table "public"."vectors_old" to "anon";

grant delete on table "public"."vectors_old" to "authenticated";

grant insert on table "public"."vectors_old" to "authenticated";

grant references on table "public"."vectors_old" to "authenticated";

grant select on table "public"."vectors_old" to "authenticated";

grant trigger on table "public"."vectors_old" to "authenticated";

grant truncate on table "public"."vectors_old" to "authenticated";

grant update on table "public"."vectors_old" to "authenticated";

grant delete on table "public"."vectors_old" to "service_role";

grant insert on table "public"."vectors_old" to "service_role";

grant references on table "public"."vectors_old" to "service_role";

grant select on table "public"."vectors_old" to "service_role";

grant trigger on table "public"."vectors_old" to "service_role";

grant truncate on table "public"."vectors_old" to "service_role";

grant update on table "public"."vectors_old" to "service_role";


create schema if not exists "stripe";


-- Create users table
CREATE TABLE IF NOT EXISTS user_daily_usage(
    user_id UUID REFERENCES auth.users (id),
    email TEXT,
    date TEXT,
    daily_requests_count INT,
    PRIMARY KEY (user_id, date)
);

-- Create chats table
CREATE TABLE IF NOT EXISTS chats(
    chat_id UUID DEFAULT uuid_generate_v4() PRIMARY KEY,
    user_id UUID REFERENCES auth.users (id),
    creation_time TIMESTAMP DEFAULT current_timestamp,
    history JSONB,
    chat_name TEXT
);


-- Create vector extension
CREATE EXTENSION IF NOT EXISTS vector;

-- Create vectors table
CREATE TABLE IF NOT EXISTS vectors (
    id UUID DEFAULT uuid_generate_v4() PRIMARY KEY,
    content TEXT,
    file_sha1 TEXT,
    metadata JSONB,
    embedding VECTOR(1536)
);

-- Create function to match vectors
CREATE OR REPLACE FUNCTION match_vectors(query_embedding VECTOR(1536), match_count INT, p_brain_id UUID)
RETURNS TABLE(
    id UUID,
    brain_id UUID,
    content TEXT,
    metadata JSONB,
    embedding VECTOR(1536),
    similarity FLOAT
) LANGUAGE plpgsql AS $$
#variable_conflict use_column
BEGIN
    RETURN QUERY
    SELECT
        vectors.id,
        brains_vectors.brain_id,
        vectors.content,
        vectors.metadata,
        vectors.embedding,
        1 - (vectors.embedding <=> query_embedding) AS similarity
    FROM
        vectors
    INNER JOIN
        brains_vectors ON vectors.id = brains_vectors.vector_id
    WHERE brains_vectors.brain_id = p_brain_id
    ORDER BY
        vectors.embedding <=> query_embedding
    LIMIT match_count;
END;
$$;

-- Create stats table
CREATE TABLE IF NOT EXISTS stats (
    time TIMESTAMP,
    chat BOOLEAN,
    embedding BOOLEAN,
    details TEXT,
    metadata JSONB,
    id INTEGER PRIMARY KEY GENERATED ALWAYS AS IDENTITY
);

-- Create summaries table
CREATE TABLE IF NOT EXISTS summaries (
    id BIGSERIAL PRIMARY KEY,
    document_id UUID REFERENCES vectors(id),
    content TEXT,
    metadata JSONB,
    embedding VECTOR(1536)
);

-- Create function to match summaries
CREATE OR REPLACE FUNCTION match_summaries(query_embedding VECTOR(1536), match_count INT, match_threshold FLOAT)
RETURNS TABLE(
    id BIGINT,
    document_id UUID,
    content TEXT,
    metadata JSONB,
    embedding VECTOR(1536),
    similarity FLOAT
) LANGUAGE plpgsql AS $$
#variable_conflict use_column
BEGIN
    RETURN QUERY
    SELECT
        id,
        document_id,
        content,
        metadata,
        embedding,
        1 - (summaries.embedding <=> query_embedding) AS similarity
    FROM
        summaries
    WHERE 1 - (summaries.embedding <=> query_embedding) > match_threshold
    ORDER BY
        summaries.embedding <=> query_embedding
    LIMIT match_count;
END;
$$;

-- Create api_keys table
CREATE TABLE IF NOT EXISTS api_keys(
    key_id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
    user_id UUID REFERENCES auth.users (id),
    name TEXT DEFAULT 'API_KEY', 
    days INT DEFAULT 30,
    only_chat BOOLEAN DEFAULT false,
    api_key TEXT UNIQUE,
    creation_time TIMESTAMP DEFAULT current_timestamp,
    deleted_time TIMESTAMP,
    is_active BOOLEAN DEFAULT true
);

--- Create prompts table
CREATE TABLE IF NOT EXISTS prompts (
    id UUID DEFAULT uuid_generate_v4() PRIMARY KEY,
    title VARCHAR(255),
    content TEXT,
    status VARCHAR(255) DEFAULT 'private'
);

DO $$ 
BEGIN 
IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'brain_type_enum') THEN
  -- Create the ENUM type 'brain_type' if it doesn't exist
  CREATE TYPE brain_type_enum AS ENUM ('doc', 'api', 'composite');
END IF;
END $$;

--- Create brains table
CREATE TABLE IF NOT EXISTS brains (
  brain_id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
  name TEXT NOT NULL,
  status TEXT,
  description TEXT,
  model TEXT,
  max_tokens INT,
  temperature FLOAT,
  prompt_id UUID REFERENCES prompts(id),
  last_update TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  brain_type brain_type_enum DEFAULT 'doc'
);


-- Create chat_history table
CREATE TABLE IF NOT EXISTS chat_history (
    message_id UUID DEFAULT uuid_generate_v4(),
    chat_id UUID REFERENCES chats(chat_id),
    user_message TEXT,
    assistant TEXT,
    message_time TIMESTAMP DEFAULT current_timestamp,
    PRIMARY KEY (chat_id, message_id),
    prompt_id UUID REFERENCES prompts(id),
    brain_id UUID REFERENCES brains(brain_id)
);

-- Create notification table

CREATE TABLE IF NOT EXISTS notifications (
  id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
  datetime TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  chat_id UUID REFERENCES chats(chat_id),
  message TEXT,
  action VARCHAR(255) NOT NULL,
  status VARCHAR(255) NOT NULL
);


-- Create brains X users table
CREATE TABLE IF NOT EXISTS brains_users (
  brain_id UUID,
  user_id UUID,
  rights VARCHAR(255),
  default_brain BOOLEAN DEFAULT false,
  PRIMARY KEY (brain_id, user_id),
  FOREIGN KEY (user_id) REFERENCES auth.users (id),
  FOREIGN KEY (brain_id) REFERENCES brains (brain_id)
);

-- Create brains X vectors table
CREATE TABLE IF NOT EXISTS brains_vectors (
  brain_id UUID,
  vector_id UUID,
  file_sha1 TEXT,
  PRIMARY KEY (brain_id, vector_id),
  FOREIGN KEY (vector_id) REFERENCES vectors (id),
  FOREIGN KEY (brain_id) REFERENCES brains (brain_id)
);

-- Create brains X vectors table
CREATE TABLE IF NOT EXISTS brain_subscription_invitations (
  brain_id UUID,
  email VARCHAR(255),
  rights VARCHAR(255),
  PRIMARY KEY (brain_id, email),
  FOREIGN KEY (brain_id) REFERENCES brains (brain_id)
);

-- Table for storing the relationship between brains for composite brains
CREATE TABLE IF NOT EXISTS composite_brain_connections (
  composite_brain_id UUID NOT NULL REFERENCES brains(brain_id),
  connected_brain_id UUID NOT NULL REFERENCES brains(brain_id),
  PRIMARY KEY (composite_brain_id, connected_brain_id),
  CHECK (composite_brain_id != connected_brain_id)
);

--- Create user_identity table
CREATE TABLE IF NOT EXISTS user_identity (
  user_id UUID PRIMARY KEY,
  openai_api_key VARCHAR(255)
);

-- Create the new table with 6 columns
CREATE TABLE IF NOT EXISTS [REDACTED](
    brain_id UUID REFERENCES brains(brain_id),
    method VARCHAR(255) CHECK (method IN ('GET', 'POST', 'PUT', 'DELETE')),
    url VARCHAR(255),
    params JSON,
    search_params JSON,
    secrets JSON
);

CREATE OR REPLACE FUNCTION public.get_user_email_by_user_id(user_id uuid)
RETURNS TABLE (email text)
SECURITY definer
AS $$
BEGIN
  RETURN QUERY SELECT au.email::text FROM auth.users au WHERE au.id = user_id;
END;
$$ LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION public.get_user_id_by_user_email(user_email text)
RETURNS TABLE (user_id uuid)
SECURITY DEFINER
AS $$
BEGIN
  RETURN QUERY SELECT au.id::uuid FROM auth.users au WHERE au.email = user_email;
END;
$$ LANGUAGE plpgsql;





CREATE TABLE IF NOT EXISTS user_settings (
  user_id UUID PRIMARY KEY,
  models JSONB DEFAULT '["gpt-3.5-turbo-1106","gpt-4"]'::jsonb,
  daily_chat_credit INT DEFAULT 300,
  max_brains INT DEFAULT 30,
  max_brain_size INT DEFAULT 100000000
);

-- knowledge table
CREATE TABLE IF NOT EXISTS knowledge (
  id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
  file_name TEXT,
  url TEXT,
  brain_id UUID NOT NULL REFERENCES brains(brain_id),
  extension TEXT NOT NULL,
  CHECK ((file_name IS NOT NULL AND url IS NULL) OR (file_name IS NULL AND url IS NOT NULL))
);


-- knowledge_vectors table
CREATE TABLE IF NOT EXISTS knowledge_vectors (
  knowledge_id UUID NOT NULL REFERENCES knowledge(id),
  vector_id UUID NOT NULL REFERENCES vectors(id),
  embedding_model TEXT NOT NULL,
  PRIMARY KEY (knowledge_id, vector_id, embedding_model)
);

-- Create the function to add user_id to the onboardings table
CREATE OR REPLACE FUNCTION public.create_user_onboarding() RETURNS TRIGGER AS $$
BEGIN
    INSERT INTO public.onboardings (user_id)
    VALUES (NEW.id);
    RETURN NEW;
END;
$$ LANGUAGE plpgsql SECURITY definer;

-- Revoke all on function handle_new_user_onboarding() from PUBLIC;
REVOKE ALL ON FUNCTION create_user_onboarding() FROM PUBLIC;

-- Drop the trigger if it exists
DROP TRIGGER IF EXISTS create_user_onboarding_trigger ON auth.users;

-- Create the trigger on the insert into the auth.users table
CREATE TRIGGER create_user_onboarding_trigger
AFTER INSERT ON auth.users
FOR EACH ROW
EXECUTE FUNCTION public.create_user_onboarding();

-- Create the onboarding table
CREATE TABLE IF NOT EXISTS onboardings (
  user_id UUID NOT NULL REFERENCES auth.users (id),
  onboarding_a BOOLEAN NOT NULL DEFAULT true,
  onboarding_b1 BOOLEAN NOT NULL DEFAULT true,
  onboarding_b2 BOOLEAN NOT NULL DEFAULT true,
  onboarding_b3 BOOLEAN NOT NULL DEFAULT true,
  creation_time TIMESTAMP DEFAULT current_timestamp,
  PRIMARY KEY (user_id)
);


-- Stripe settings --
-- Create extension 'wrappers' if it doesn't exist
CREATE EXTENSION IF NOT EXISTS wrappers;

-- Create foreign data wrapper 'stripe_wrapper' if it doesn't exist
DO $$ 
BEGIN
  IF NOT EXISTS (
    SELECT 1 
    FROM information_schema.foreign_data_wrappers 
    WHERE foreign_data_wrapper_name = 'stripe_wrapper'
  ) THEN
    CREATE FOREIGN DATA WRAPPER stripe_wrapper
      HANDLER stripe_fdw_handler;
  END IF;
END $$;

-- Check if the server 'stripe_server' exists before creating it
DO $$ 
BEGIN
  IF NOT EXISTS (SELECT 1 FROM pg_foreign_server WHERE srvname = 'stripe_server') THEN
    CREATE SERVER stripe_server
      FOREIGN DATA WRAPPER stripe_wrapper
      OPTIONS (
        api_key '[REDACTED]  -- Replace with your Stripe API key
      );
  END IF;
END $$;

-- Create foreign table 'public.customers' if it doesn't exist
DO $$ 
BEGIN
  IF NOT EXISTS (
    SELECT 1 
    FROM information_schema.tables 
    WHERE table_name = 'customers' 
  ) THEN
    CREATE FOREIGN TABLE public.customers (
      id text,
      email text,
      name text,
      description text,
      created timestamp,
      attrs jsonb
    )
    SERVER stripe_server
    OPTIONS (
      OBJECT 'customers',
      ROWID_COLUMN 'id'
    );
  END IF;
END $$;

-- Create table 'users' if it doesn't exist
CREATE TABLE IF NOT EXISTS public.users (
  id uuid REFERENCES auth.users NOT NULL PRIMARY KEY,
  email text
);

-- Create or replace function 'public.handle_new_user' 
CREATE OR REPLACE FUNCTION public.handle_new_user() 
RETURNS TRIGGER AS $$
BEGIN
  INSERT INTO public.users (id, email)
  VALUES (NEW.id, NEW.email);
  RETURN NEW;
END;
$$ LANGUAGE plpgsql SECURITY DEFINER;

-- Check if the trigger 'on_auth_user_created' exists before creating it
DO $$ 
BEGIN
  IF NOT EXISTS (SELECT 1 FROM pg_trigger WHERE tgname = 'on_auth_user_created') THEN
    CREATE TRIGGER on_auth_user_created
      AFTER INSERT ON auth.users
      FOR EACH ROW EXECUTE FUNCTION public.handle_new_user();
  END IF;
END $$;

insert into
  storage.buckets (id, name)
values
  ('quivr', 'quivr');

CREATE POLICY "Access Quivr Storage 1jccrwz_0" ON storage.objects FOR INSERT TO anon WITH CHECK (bucket_id = 'quivr');

CREATE POLICY "Access Quivr Storage 1jccrwz_1" ON storage.objects FOR SELECT TO anon USING (bucket_id = 'quivr');

CREATE POLICY "Access Quivr Storage 1jccrwz_2" ON storage.objects FOR UPDATE TO anon USING (bucket_id = 'quivr');

CREATE POLICY "Access Quivr Storage 1jccrwz_3" ON storage.objects FOR DELETE TO anon USING (bucket_id = 'quivr');

-- Create functions for secrets in vault
CREATE OR REPLACE FUNCTION insert_secret(name text, secret text)
returns uuid
language plpgsql
security definer
set search_path = public
as $$
begin
  return vault.create_secret(secret, name);
end;
$$;


create or replace function read_secret(secret_name text)
returns text
language plpgsql
security definer set search_path = public
as $$
declare
  secret text;
begin
  select decrypted_secret from vault.decrypted_secrets where name =
  secret_name into secret;
  return secret;
end;
$$;

create or replace function delete_secret(secret_name text)
returns text
language plpgsql
security definer set search_path = public
as $$
declare
 deleted_rows int;
begin
 delete from vault.decrypted_secrets where name = secret_name;
 get diagnostics deleted_rows = row_count;
 if deleted_rows = 0 then
   return false;
 else
   return true;
 end if;
end;
$$;

create schema if not exists extensions;

create table if not exists
  extensions.wrappers_fdw_stats ();

grant all on extensions.wrappers_fdw_stats to service_role;



