-- ---------------------------------------------------------------------------
-- O irmao no PostgreSQL de `scripts/migracao-confirmacoes.sql` (07/11/2026, a fatia 103,
-- IDEMPOTENCIA-DAS-ESCRITAS-DE-DINHEIRO; a resposta 87 (a) do dono; o D162 e o D285), para a
-- COPIA LOCAL de pe -- a tabela como o `scripts/gerar-ddl-postgres.php` a emite, tirada linha a
-- linha do `postgres/schema.sql`: o inquilino na frente, os dois indices com ele, a chave
-- estrangeira do inquilino, o RLS ligado e forcado e a politica. Os bancos da suite, o do
-- contrato e a producao nascem do `postgres/schema.sql`; a producao recebe as linhas do MySQL
-- pela carga (`scripts/migrar-dados.sh`), depois do passo 0 de la.
--
--   docker exec -i franquiabv-postgres-1 sh -c 'psql -U "$POSTGRES_USER" -d franquiabv_dev -v ON_ERROR_STOP=1' \
--     < postgres/migracao-confirmacoes.sql
--
-- IDEMPOTENTE, numa transacao so, com a conferencia de ausencia dentro dela: a tabela que ja
-- existe nao e tocada ("a tabela ja existe: nada feito"). Os privilegios do `bvip_app` vem do
-- `ALTER DEFAULT PRIVILEGES` do esquema, e sao dados de novo aqui, para a copia montada por
-- outro papel. NENHUM DELETE. PARA DESFAZER, so `DROP TABLE confirmacoes;`.
-- ---------------------------------------------------------------------------

SET client_encoding = 'UTF8';

BEGIN;

DO $$
BEGIN
    IF to_regclass('confirmacoes') IS NOT NULL THEN
        RAISE NOTICE 'a tabela ja existe: nada feito';
        RETURN;
    END IF;

    CREATE TABLE confirmacoes (
        inquilino_id                     integer NOT NULL DEFAULT current_setting('app.inquilino_id')::integer,
        id                               integer GENERATED BY DEFAULT AS IDENTITY,
        usuario                          integer NOT NULL,
        chave                            varchar(64) NOT NULL,
        unidade                          integer NOT NULL,
        rota                             varchar(150) NOT NULL,
        pedido                           varchar(64) NOT NULL,
        situacao                         smallint DEFAULT NULL,
        resposta                         text,
        data                             timestamptz NOT NULL,
        PRIMARY KEY (id)
    );

    CREATE UNIQUE INDEX confirmacoes_UNQ_CONFIRMACOES_usuario_chave ON confirmacoes (inquilino_id, usuario, chave);
    CREATE INDEX confirmacoes_IDX_CONFIRMACOES_data ON confirmacoes (inquilino_id, data);

    ALTER TABLE confirmacoes ADD CONSTRAINT confirmacoes_inquilino_fk
        FOREIGN KEY (inquilino_id) REFERENCES inquilinos (id);
    ALTER TABLE confirmacoes ENABLE ROW LEVEL SECURITY;
    ALTER TABLE confirmacoes FORCE  ROW LEVEL SECURITY;
    CREATE POLICY inquilino_isolado ON confirmacoes
        USING      (inquilino_id = current_setting('app.inquilino_id')::integer)
        WITH CHECK (inquilino_id = current_setting('app.inquilino_id')::integer);

    IF EXISTS (SELECT 1 FROM pg_roles WHERE rolname = 'bvip_app') THEN
        GRANT SELECT, INSERT, UPDATE, DELETE ON confirmacoes TO bvip_app;
        GRANT USAGE, SELECT ON SEQUENCE confirmacoes_id_seq TO bvip_app;
    END IF;
END
$$;

COMMIT;

-- Conferencia: o RLS ligado e forcado, os privilegios do `bvip_app` e as linhas (0).
SELECT relrowsecurity AS rls, relforcerowsecurity AS forcado FROM pg_class WHERE oid = 'confirmacoes'::regclass;

SELECT string_agg(privilege_type, ',' ORDER BY privilege_type) AS privilegios_do_bvip_app
  FROM information_schema.role_table_grants
 WHERE table_name = 'confirmacoes' AND grantee = 'bvip_app';

SET app.inquilino_id = '1';

SELECT COUNT(*) AS confirmacoes FROM confirmacoes;
