-- ============================================
-- Canvas de Ideias - Estrutura de Banco de Dados
-- Framework Galaxia - Versão 2
-- ============================================

-- Tabela: Pensamentos
-- Armazena todos os pensamentos/ideias do sistema
CREATE TABLE "public"."gx_canvas_pensamentos" (
    -- 1. Identificador Principal
    "id" int4 NOT NULL DEFAULT nextval('apps_id_seq'::regclass),
    
    -- 2. Colunas de Negócio
    "transcricao" text NOT NULL,
    "hash" varchar(64) NOT NULL,
    
    -- Hierarquia
    "capitulo" int2 DEFAULT 0,
    "capitulos_hash" varchar(64),
    "canvaitem" int2 DEFAULT 0,
    "canvaitem_pensamentos_hash" varchar(64),
    
    -- Data e Posicionamento
    "dia_efetivo" date NOT NULL,
    "pos_x" numeric(5,2),
    "pos_y" numeric(5,2),
    
    -- 3. Colunas Obrigatórias do Framework
    "data_cadastro" timestamp(6),
    "data_atualizacao" timestamp(6),
    "usuario_cadastro" varchar(255) COLLATE "pg_catalog"."default" DEFAULT 'default'::character varying,
    "usuario_atualizacao" varchar(255) COLLATE "pg_catalog"."default" DEFAULT 'default'::character varying,
    
    -- Campos de Isolamento (Blocks)
    "block_usuario_id" int4,
    "block_filial_id" int4,
    "block_empresa_id" int2,
    "block" int4 NOT NULL DEFAULT 0,
    "block_quem" varchar(255) COLLATE "pg_catalog"."default",
    "block_data" timestamp(0) DEFAULT CURRENT_TIMESTAMP,
    
    -- Campos de Sistema e Auditoria
    "codigomd5" varchar(255) COLLATE "pg_catalog"."default",
    "ultatualizacao" timestamp(0),
    "usuarioc" varchar(255) COLLATE "pg_catalog"."default",
    "ultuser" varchar(255) COLLATE "pg_catalog"."default",
    "system" varchar(255) COLLATE "pg_catalog"."default",
    
    -- Chave Primária
    CONSTRAINT "gx_canvas_pensamentos_pkey" PRIMARY KEY ("id")
);

-- Índices para Pensamentos
CREATE UNIQUE INDEX "idx_pensamentos_hash" ON "public"."gx_canvas_pensamentos" USING btree ("hash");
CREATE INDEX "idx_pensamentos_capitulos_hash" ON "public"."gx_canvas_pensamentos" USING btree ("capitulos_hash");
CREATE INDEX "idx_pensamentos_dia_efetivo" ON "public"."gx_canvas_pensamentos" USING btree ("dia_efetivo");
CREATE INDEX "idx_pensamentos_block" ON "public"."gx_canvas_pensamentos" USING btree ("block", "block_usuario_id");
CREATE INDEX "idx_pensamentos_dia_block" ON "public"."gx_canvas_pensamentos" USING btree ("dia_efetivo", "block", "block_usuario_id");

-- ============================================

-- Tabela: Capítulos
-- Armazena os pensamentos que são capítulos (triggers)
CREATE TABLE "public"."gx_canvas_capitulos" (
    -- 1. Identificador Principal
    "id" int4 NOT NULL DEFAULT nextval('apps_id_seq'::regclass),
    
    -- 2. Colunas de Negócio
    "pensamento_hash" varchar(64) NOT NULL,
    "hash" varchar(64) NOT NULL,
    "titulo" varchar(255),
    "descricao" text,
    
    -- 3. Colunas Obrigatórias do Framework
    "data_cadastro" timestamp(6),
    "data_atualizacao" timestamp(6),
    "usuario_cadastro" varchar(255) COLLATE "pg_catalog"."default" DEFAULT 'default'::character varying,
    "usuario_atualizacao" varchar(255) COLLATE "pg_catalog"."default" DEFAULT 'default'::character varying,
    
    -- Campos de Isolamento (Blocks)
    "block_usuario_id" int4,
    "block_filial_id" int4,
    "block_empresa_id" int2,
    "block" int4 NOT NULL DEFAULT 0,
    "block_quem" varchar(255) COLLATE "pg_catalog"."default",
    "block_data" timestamp(0) DEFAULT CURRENT_TIMESTAMP,
    
    -- Campos de Sistema e Auditoria
    "codigomd5" varchar(255) COLLATE "pg_catalog"."default",
    "ultatualizacao" timestamp(0),
    "usuarioc" varchar(255) COLLATE "pg_catalog"."default",
    "ultuser" varchar(255) COLLATE "pg_catalog"."default",
    "system" varchar(255) COLLATE "pg_catalog"."default",
    
    -- Chave Primária
    CONSTRAINT "gx_canvas_capitulos_pkey" PRIMARY KEY ("id")
);

-- Índices para Capítulos
CREATE UNIQUE INDEX "idx_capitulos_hash" ON "public"."gx_canvas_capitulos" USING btree ("hash");
CREATE UNIQUE INDEX "idx_capitulos_pensamento_hash" ON "public"."gx_canvas_capitulos" USING btree ("pensamento_hash");
CREATE INDEX "idx_capitulos_block" ON "public"."gx_canvas_capitulos" USING btree ("block", "block_usuario_id");

-- ============================================

-- Tabela: Conexões
-- Armazena hierarquias e conexões entre pensamentos
CREATE TABLE "public"."gx_canvas_conexoes" (
    -- 1. Identificador Principal
    "id" int4 NOT NULL DEFAULT nextval('apps_id_seq'::regclass),
    
    -- 2. Colunas de Negócio
    "capitulos_hash" varchar(64) NOT NULL,
    "pensamentos_hash" varchar(64) NOT NULL,
    "nivel" int4 NOT NULL DEFAULT 1,
    "capitulos_pensamento_hash" varchar(64),
    "tipo_conexao" varchar(50) DEFAULT 'hierarquica'::character varying,
    "ordem" int4 DEFAULT 0,
    
    -- 3. Colunas Obrigatórias do Framework
    "data_cadastro" timestamp(6),
    "data_atualizacao" timestamp(6),
    "usuario_cadastro" varchar(255) COLLATE "pg_catalog"."default" DEFAULT 'default'::character varying,
    "usuario_atualizacao" varchar(255) COLLATE "pg_catalog"."default" DEFAULT 'default'::character varying,
    
    -- Campos de Isolamento (Blocks)
    "block_usuario_id" int4,
    "block_filial_id" int4,
    "block_empresa_id" int2,
    "block" int4 NOT NULL DEFAULT 0,
    "block_quem" varchar(255) COLLATE "pg_catalog"."default",
    "block_data" timestamp(0) DEFAULT CURRENT_TIMESTAMP,
    
    -- Campos de Sistema e Auditoria
    "codigomd5" varchar(255) COLLATE "pg_catalog"."default",
    "ultatualizacao" timestamp(0),
    "usuarioc" varchar(255) COLLATE "pg_catalog"."default",
    "ultuser" varchar(255) COLLATE "pg_catalog"."default",
    "system" varchar(255) COLLATE "pg_catalog"."default",
    
    -- Chave Primária
    CONSTRAINT "gx_canvas_conexoes_pkey" PRIMARY KEY ("id")
);

-- Índices para Conexões
CREATE INDEX "idx_conexoes_capitulos_hash" ON "public"."gx_canvas_conexoes" USING btree ("capitulos_hash");
CREATE INDEX "idx_conexoes_pensamentos_hash" ON "public"."gx_canvas_conexoes" USING btree ("pensamentos_hash");
CREATE INDEX "idx_conexoes_nivel" ON "public"."gx_canvas_conexoes" USING btree ("nivel");
CREATE INDEX "idx_conexoes_block" ON "public"."gx_canvas_conexoes" USING btree ("block", "block_usuario_id");
CREATE INDEX "idx_conexoes_capitulos_nivel" ON "public"."gx_canvas_conexoes" USING btree ("capitulos_hash", "nivel");

-- ============================================
-- Comentários nas Tabelas
-- ============================================

COMMENT ON TABLE "public"."gx_canvas_pensamentos" IS 'Armazena pensamentos e ideias do Canvas';
COMMENT ON TABLE "public"."gx_canvas_capitulos" IS 'Capítulos de pensamentos (triggers)';
COMMENT ON TABLE "public"."gx_canvas_conexoes" IS 'Conexões hierárquicas entre pensamentos';

-- ============================================
-- View: Pensamentos Completos
-- ============================================

CREATE OR REPLACE VIEW "public"."vw_canvas_pensamentos_completos" AS
SELECT 
    p.*,
    c.hash AS capitulo_hash,
    c.titulo AS capitulo_titulo,
    c.descricao AS capitulo_descricao
FROM 
    gx_canvas_pensamentos p
LEFT JOIN 
    gx_canvas_capitulos c ON p.hash = c.pensamento_hash;
