drop function if exists update_title;
drop function if exists get_title_update_template;
drop function if exists get_title;
drop function if exists get_title_schema;


create function get_title_schema() returns jsonb as
$$
declare
begin
    return '{"value": {"opetional": false, "readonly": false}}'::jsonb;
end;
$$
language plpgsql;


create function get_title() returns jsonb as
$$
declare
    v_value text;
begin
    select value into v_value from title;
    return format('{"value": "%s"}', v_value)::jsonb;
end;
$$
language plpgsql;


create function get_title_update_template() returns jsonb as
$$
declare
begin
    return '{"operation": "update", "type": "title", "value": ""}'::jsonb;
end;
$$
language plpgsql;


create function update_title(new jsonb) returns jsonb as
$$
declare
    old jsonb;
    redo_sql text;
    undo_sql text;
    redo_cs jsonb;
    undo_cs jsonb;

begin
    assert new->>'operation' = 'update';
    assert new->>'type' = 'title';
    assert new ? 'value';

    old := get_title();
    if old->>'value' = new->>'value' then
        return '{}'::jsonb;
    end if;

    redo_sql := format('update title set value = ''%s''', new->>'value');
    undo_sql := format('update title set value = ''%s''', old->>'value');

    redo_cs := format('{"operation": "update", "type": "title", "value": "%s" }', new->>'value')::jsonb;
    undo_cs := format('{"operation": "update", "type": "title", "value": "%s" }', old->>'value')::jsonb;

    execute redo_sql;
    execute add_operation(redo_sql, undo_sql, redo_cs, undo_cs);

    return redo_cs;

end;
$$
language plpgsql;
