--
--
--

CREATE TYPE schedoc_status AS ENUM ('public', 'private', 'legacy', 'wip');

CREATE TABLE schedoc_column_raw (
  objoid    oid,
  objsubid  oid,
  comment   jsonb,
  status    schedoc_status,
  PRIMARY KEY (objoid, objsubid)
);

CREATE VIEW schedoc_column_comments AS

    SELECT current_database() as databasename, c.relname as tablename, a.attname as columnname, status
    FROM schedoc_column_raw ccr
    JOIN pg_class c ON c.oid = ccr.objoid
    JOIN pg_attribute a ON (a.attnum = ccr.objsubid AND a.attrelid = ccr.objoid);

--
--
--
CREATE OR REPLACE FUNCTION schedoc_start()
RETURNS void
    LANGUAGE plpgsql AS
$EOF$
DECLARE
  schemaname TEXT;
BEGIN
  SELECT n.nspname FROM pg_extension e JOIN pg_namespace n ON n.oid=e.extnamespace WHERE e.extname='ddl_historization' INTO schemaname;

   --
   -- Function to manage INSERT statements
   --

   EXECUTE format('CREATE OR REPLACE FUNCTION %s.schedoc_trg()
        RETURNS trigger LANGUAGE plpgsql AS $$
    BEGIN
    INSERT INTO %s.schedoc_column_raw (objoid, objsubid, comment, status)
    VALUES (
      NEW.objoid,
      NEW.objsubid,
      %s.schedoc_get_column_description(NEW.objoid, NEW.objsubid)::jsonb,
      %s.schedoc_get_column_status(NEW.objoid, NEW.objsubid)::public.schedoc_status
    ) ON CONFLICT (objoid, objsubid)
    DO UPDATE SET
      comment = %s.schedoc_get_column_description(EXCLUDED.objoid, EXCLUDED.objsubid)::jsonb,
      status = %s.schedoc_get_column_status(EXCLUDED.objoid, EXCLUDED.objsubid)::public.schedoc_status;
    RETURN NEW;
    END;
$$', schemaname, schemaname, schemaname, schemaname, schemaname, schemaname);

   --
   -- Create two triggers, one for UPDATE and one for INSERT
   --

   EXECUTE format('
     CREATE TRIGGER schedoc_trg
       BEFORE INSERT ON %s.ddl_history
       FOR EACH ROW
       WHEN (NEW.ddl_tag = ''COMMENT'')
       EXECUTE PROCEDURE %s.schedoc_trg()',
     schemaname,schemaname);

END;
$EOF$;


CREATE OR REPLACE FUNCTION schedoc_get_column_description(bjoid oid, bjsubid oid)
RETURNS text
    LANGUAGE plpgsql AS
$EOF$
DECLARE
  description TEXT;
BEGIN
    SELECT pg_description.description FROM pg_description
    WHERE pg_description.objoid=bjoid AND pg_description.objsubid=bjsubid INTO description;

    RETURN description;
END;
$EOF$;

CREATE OR REPLACE FUNCTION schedoc_get_column_status(bjoid oid, bjsubid oid)
RETURNS text
    LANGUAGE plpgsql AS
$EOF$
DECLARE
  status TEXT;
BEGIN
    SELECT pg_description.description::jsonb->>'status' FROM pg_description
    WHERE pg_description.objoid=bjoid AND pg_description.objsubid=bjsubid INTO status;

    RETURN status;
END;
$EOF$;

-- CREATE TRIGGER schedoc_trg
--    BEFORE INSERT ON ddl_history
--    FOR EACH ROW
--    EXECUTE PROCEDURE schedoc_trg();

SELECT schedoc_start();
