create type "public"."estado_conversacion" as enum ('ACTIVA', 'ARCHIVANDO', 'ARCHIVADA', 'ERROR');

drop view if exists "public"."plantilla_plan";

drop index if exists "public"."planes_estudio_conversation_id_key";


  create table "public"."conversaciones_asignatura" (
    "id" uuid not null default gen_random_uuid(),
    "asignatura_id" uuid not null,
    "openai_conversation_id" text not null,
    "estado" public.estado_conversacion not null default 'ACTIVA'::public.estado_conversacion,
    "conversacion_json" jsonb not null default '{}'::jsonb,
    "creado_por" uuid,
    "creado_en" timestamp with time zone not null default now(),
    "archivado_por" uuid,
    "archivado_en" timestamp with time zone,
    "intento_archivado" integer not null default 0
      );



  create table "public"."conversaciones_plan" (
    "id" uuid not null default gen_random_uuid(),
    "plan_estudio_id" uuid not null,
    "openai_conversation_id" text not null,
    "estado" public.estado_conversacion not null default 'ACTIVA'::public.estado_conversacion,
    "conversacion_json" jsonb not null default '{}'::jsonb,
    "creado_por" uuid,
    "creado_en" timestamp with time zone not null default now(),
    "archivado_por" uuid,
    "archivado_en" timestamp with time zone,
    "intento_archivado" integer not null default 0
      );


alter table "public"."planes_estudio" drop column "conversation_id";

CREATE UNIQUE INDEX conversaciones_asignatura_openai_id_unico ON public.conversaciones_asignatura USING btree (openai_conversation_id);

CREATE UNIQUE INDEX conversaciones_asignatura_pkey ON public.conversaciones_asignatura USING btree (id);

CREATE UNIQUE INDEX conversaciones_plan_openai_id_unico ON public.conversaciones_plan USING btree (openai_conversation_id);

CREATE UNIQUE INDEX conversaciones_plan_pkey ON public.conversaciones_plan USING btree (id);

CREATE INDEX idx_conv_asig_asignatura ON public.conversaciones_asignatura USING btree (asignatura_id);

CREATE INDEX idx_conv_asig_estado ON public.conversaciones_asignatura USING btree (estado);

CREATE INDEX idx_conv_plan_estado ON public.conversaciones_plan USING btree (estado);

CREATE INDEX idx_conv_plan_plan_estudio ON public.conversaciones_plan USING btree (plan_estudio_id);

alter table "public"."conversaciones_asignatura" add constraint "conversaciones_asignatura_pkey" PRIMARY KEY using index "conversaciones_asignatura_pkey";

alter table "public"."conversaciones_plan" add constraint "conversaciones_plan_pkey" PRIMARY KEY using index "conversaciones_plan_pkey";

alter table "public"."conversaciones_asignatura" add constraint "conversaciones_asignatura_archivado_por_fkey" FOREIGN KEY (archivado_por) REFERENCES public.usuarios_app(id) ON DELETE SET NULL not valid;

alter table "public"."conversaciones_asignatura" validate constraint "conversaciones_asignatura_archivado_por_fkey";

alter table "public"."conversaciones_asignatura" add constraint "conversaciones_asignatura_asignatura_id_fkey" FOREIGN KEY (asignatura_id) REFERENCES public.asignaturas(id) ON DELETE CASCADE not valid;

alter table "public"."conversaciones_asignatura" validate constraint "conversaciones_asignatura_asignatura_id_fkey";

alter table "public"."conversaciones_asignatura" add constraint "conversaciones_asignatura_creado_por_fkey" FOREIGN KEY (creado_por) REFERENCES public.usuarios_app(id) ON DELETE SET NULL not valid;

alter table "public"."conversaciones_asignatura" validate constraint "conversaciones_asignatura_creado_por_fkey";

alter table "public"."conversaciones_asignatura" add constraint "conversaciones_asignatura_openai_id_unico" UNIQUE using index "conversaciones_asignatura_openai_id_unico";

alter table "public"."conversaciones_plan" add constraint "conversaciones_plan_archivado_por_fkey" FOREIGN KEY (archivado_por) REFERENCES public.usuarios_app(id) ON DELETE SET NULL not valid;

alter table "public"."conversaciones_plan" validate constraint "conversaciones_plan_archivado_por_fkey";

alter table "public"."conversaciones_plan" add constraint "conversaciones_plan_creado_por_fkey" FOREIGN KEY (creado_por) REFERENCES public.usuarios_app(id) ON DELETE SET NULL not valid;

alter table "public"."conversaciones_plan" validate constraint "conversaciones_plan_creado_por_fkey";

alter table "public"."conversaciones_plan" add constraint "conversaciones_plan_openai_id_unico" UNIQUE using index "conversaciones_plan_openai_id_unico";

alter table "public"."conversaciones_plan" add constraint "conversaciones_plan_plan_estudio_id_fkey" FOREIGN KEY (plan_estudio_id) REFERENCES public.planes_estudio(id) ON DELETE CASCADE not valid;

alter table "public"."conversaciones_plan" validate constraint "conversaciones_plan_plan_estudio_id_fkey";

create or replace view "public"."plantilla_plan" as  SELECT plan.id AS plan_estudio_id,
    struct.id AS estructura_id,
    struct.template_id
   FROM (public.planes_estudio plan
     JOIN public.estructuras_plan struct ON ((plan.estructura_id = struct.id)));


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

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

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

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

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

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

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

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

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

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

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

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

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

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

grant delete on table "public"."conversaciones_asignatura" to "postgres";

grant insert on table "public"."conversaciones_asignatura" to "postgres";

grant references on table "public"."conversaciones_asignatura" to "postgres";

grant select on table "public"."conversaciones_asignatura" to "postgres";

grant trigger on table "public"."conversaciones_asignatura" to "postgres";

grant truncate on table "public"."conversaciones_asignatura" to "postgres";

grant update on table "public"."conversaciones_asignatura" to "postgres";

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

grant delete on table "public"."conversaciones_plan" to "postgres";

grant insert on table "public"."conversaciones_plan" to "postgres";

grant references on table "public"."conversaciones_plan" to "postgres";

grant select on table "public"."conversaciones_plan" to "postgres";

grant trigger on table "public"."conversaciones_plan" to "postgres";

grant truncate on table "public"."conversaciones_plan" to "postgres";

grant update on table "public"."conversaciones_plan" to "postgres";

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

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

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

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

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

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

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


