--
-- file_storage__new_root_folder/3
--
create or replace function file_storage__new_root_folder(
  integer,
  character varying,
  character varying
) returns int4 as $$
	--  fs_root_folders.folder_id%TYPE
declare
	new_root_folder__package_id         alias for $1;
        new_root_folder__folder_name        alias for $2;
        new_root_folder__description        alias for $3;
        v_folder_id		            fs_root_folders.folder_id%TYPE;
        v_package_name		            apm_packages.instance_name%TYPE;
        v_package_key		            apm_packages.package_key%TYPE;
        v_folder_name                       cr_folders.label%TYPE;
        v_description                       cr_folders.description%TYPE;
begin

        select instance_name, package_key 
        into v_package_name, v_package_key
        from apm_packages
        where package_id = new_root_folder__package_id;

        if new_root_folder__folder_name is null
        then
            v_folder_name := v_package_name || ' Root Folder ';
        else
            v_folder_name := new_root_folder__folder_name;
        end if;

        if new_root_folder__description is null
        then
            v_description := 'Root folder for the file-storage system.  All other folders in file storage are subfolders of this one.';
        else
            v_description := new_root_folder__description;
        end if;

        v_folder_id := content_folder__new (
            v_package_key || '_' || new_root_folder__package_id, -- name
            v_folder_name, -- label
            v_description, -- description
	    null				  -- parent_id (default)
        );

        insert into fs_root_folders 
        (package_id, folder_id)
        values 
        (new_root_folder__package_id, v_folder_id);

        -- allow child items to be added
	-- JS: Note that we need to set include_subtypes to 
	-- JS: true since we created a new subtype.
        PERFORM content_folder__register_content_type(
		v_folder_id,	        -- folder_id
		'content_revision',   -- content_types
		't'			-- include_subtypes 
		);
        PERFORM content_folder__register_content_type(
		v_folder_id,		-- folder_id
		'content_folder',	-- content_types
		't'			-- include_subtypes 
		);

        -- set up default permissions
        PERFORM acs_permission__grant_permission (
		v_folder_id,                          -- object_id
		acs__magic_object_id('the_public'), -- grantee_id 
		'read'			      -- privilege
		);

        PERFORM acs_permission__grant_permission (
		v_folder_id,			            -- object_id 
		acs__magic_object_id('registered_users'), -- grantee_id
		'write'				    -- privilege
		);

	return v_folder_id;

end;$$ language plpgsql;


--
-- file_storage__new_root_folder/4
--
create or replace function file_storage__new_root_folder(
  new_root_folder__package_id integer,
  new_root_folder__folder_name character varying,
  new_root_folder__url character varying,
  new_root_folder__description character varying
) returns int4 as $$

DECLARE
        v_folder_id                         fs_root_folders.folder_id%TYPE;
BEGIN
        v_folder_id := content_folder__new (
            new_root_folder__url, -- name
            new_root_folder__folder_name, -- label
        new_root_folder__description, -- description
            null,  -- parent_id (default)
        new_root_folder__package_id, --context_id
        null, --folder_id
        null, --creation_date
        null, --creation_user
        null, --creation_ip
            new_root_folder__package_id --package_id
    );

        insert into fs_root_folders (package_id, folder_id)
        values (new_root_folder__package_id, v_folder_id);

        --                
        -- Register the needed content types
        --
        -- GN: Maybe, when someone decides to really implement the half-cooked
        -- "image" content type, it should go in here as well.
    
        PERFORM content_folder__register_content_type(
                v_folder_id,            -- folder_id
                'file_storage_object',  -- content_types
                'f');                   -- include_subtypes 
        
        PERFORM content_folder__register_content_type(
                v_folder_id,            -- folder_id
                'content_folder',    -- content_types
                't');                   -- include_subtypes 

        PERFORM content_folder__register_content_type(
                v_folder_id,            -- folder_id
                'content_extlink',    -- content_types
                't');                   -- include_subtypes 

--        PERFORM content_folder__register_content_type(
--                v_folder_id,            -- folder_id
--                'content_symlink',      -- content_types
--                't');                   -- include_subtypes 
--                );

        return v_folder_id;
END;
$$ language plpgsql;