-- @jennie.ybos.net
-- @wirth.ybos.net
--openacs port @samir.symphinity.com


create function inline_0 ()
returns integer as '
begin
    PERFORM acs_object_type__create_type (
	''faq'',			-- object_type
	''FAQ'',			-- pretty_name
	''FAQs'',			-- pretty_plural
	''acs_object'',		-- supertype
	''FAQS'',			-- table_name
	''FAQ_ID'',		-- id_column
	null,				-- package_name
	''f'',				-- abstract_p
	null,				-- type_extension_table
	''faq.name''		-- name_method
	);

  return 0;
end;' language 'plpgsql';

select inline_0 ();

drop function inline_0 ();


create table faqs (
		faq_id    integer constraint faqs_faq_id_fk
			  references acs_objects(object_id)
			  constraint faqs_pk
			  primary key,
		faq_name  varchar (250)
		          constraint faqs_faq_name_nn   not null,
		separate_p boolean  check(separate_p in ('f','t'))
);


create function inline_1 ()
returns integer as '
begin
    PERFORM acs_object_type__create_type (
	''faq_q_and_a'',			-- object_type
	''FAQ_Q_and_A'',			-- pretty_name
	''FAQ_Q_and_As'',			-- pretty_plural
	''acs_object'',		-- supertype
	''FAQ_Q_AND_AS'',			-- table_name
	''ENTRY_ID'',		-- id_column
	null,				-- package_name
	''f'',				-- abstract_p
	null,				-- type_extension_table
	null		-- name_method
	);

  return 0;
end;' language 'plpgsql';

select inline_1 ();

drop function inline_1 ();


create table faq_q_and_as (
	entry_id  integer constraint faq_q_and_as_entry_id_fk
		  references acs_objects (object_id)
		  constraint faq_q_sand_a_pk
         	  primary key,
	faq_id	  integer references faqs not null,
	question  varchar (4000) not null,
	answer    varchar (4000) not null,
	-- determines the order of questions in a FAQ
	sort_key  integer not null
);

create 	function faq__new_q_and_a (integer,integer,varchar,varchar,integer,varchar,timestamp,integer,varchar,integer
    	) returns integer as
'
declare
	p_entry_id   		alias for $1;				-- default null,
	p_faq_id     		alias for $2;
	p_question   		alias for $3;
	p_answer     		alias for $4;
	p_sort_key   		alias for $5;
	p_object_type 	alias for $6;     		-- default faq_q_and_a
	p_creation_date alias for $7;  --in acs_objects.creation_date%TYPE   default sysdate,
	p_creation_user alias for $8;	 --in acs_objects.creation_user%TYPE   default null,
	p_creation_ip    	alias for $9;		-- in acs_objects.creation_ip%TYPE     default null,
	p_context_id     	alias for $10; 	--in acs_objects.context_id%TYPE      default null
	v_entry_id 			faq_q_and_as.entry_id%TYPE;
begin
	v_entry_id := acs_object__new (
		p_entry_id,
		p_object_type,		
		p_creation_date,
		p_creation_user,
		p_creation_ip,
		p_context_id
  );
	insert into faq_q_and_as
		(entry_id, faq_id, question, answer, sort_key)
	values
		(v_entry_id, p_faq_id, p_question, p_answer, p_sort_key);
  return v_entry_id;

end;' language 'plpgsql';

create function  faq__delete_q_and_a (integer)
returns integer as '
declare
	p_entry_id	alias for $1;
begin
	delete from faq_q_and_as where entry_id =  p_entry_id;
	raise NOTICE ''Deleting FAQ_Q_and_A...'';
	PERFORM acs_object__delete(p_entry_id);

	return 0;

end;' language 'plpgsql';


create function faq__new_faq (integer, varchar, boolean,varchar,timestamp,integer,varchar,integer )
returns integer as '
declare
	p_faq_id				alias for $1;
	p_faq_name 			alias for $2;
	p_separate_p		alias for $3;
	p_object_type 	alias for $4;
	p_creation_date	alias for $5;
	p_creation_user alias for $6;
	p_creation_ip		alias for $7;
	p_context_id 		alias for $8;
	v_faq_id 				faqs.faq_id%TYPE;
begin

	v_faq_id := acs_object__new (
		p_faq_id,
		p_object_type,
		p_creation_date,
		p_creation_user,
		p_creation_ip,
		p_context_id
  );

	insert into faqs
		(faq_id, faq_name,separate_p)
	values
		(v_faq_id, p_faq_name,p_separate_p);

return v_faq_id;

end;' language 'plpgsql';


create function faq__delete_faq (integer)
returns integer as '
declare
	p_faq_id 	alias for $1;
	del_rec record;
begin
	   	-- Because q_and_as are objects, we need to
    	-- loop through a list of them, and call an explicit
    	-- delete function for each one. (i.e. each
    	-- entry_id)
	for del_rec in select entry_id from faq_q_and_as
		where faq_id = p_faq_id
  loop
		PERFORM faq__delete_q_and_a(del_rec.entry_id);
	end loop;
	
	delete from faqs where faq_id = p_faq_id;
	
	PERFORM  acs_object__delete(p_faq_id);

	return 0;

end;' language 'plpgsql';

create function faq__name(integer)
returns varchar as '
declare 
    p_faq_id      alias for $1;
    v_faq_name    faqs.faq_name%TYPE;
begin
	select faq_name  into v_faq_name
		from faqs
		where faq_id = p_faq_id;

    return v_faq_name;
end;
' language 'plpgsql';

create function faq__clone (integer,integer)
returns integer as '
declare
 p_new_package_id  	alias for $1;   --default null,
 p_old_package_id 	alias for $2;   --default null
 v_faq_id 		faqs.faq_id%TYPE;
 one_faq		record;
 entry			record;

begin
            -- get all the faqs belonging to the old package,
            -- and create new faqs for the new package
            for one_faq in select *
                            from acs_objects o, faqs f
                            where o.object_id = f.faq_id
                            and o.context_id = p_old_package_id
            loop
               v_faq_id := faq__new_faq (
                    			one_faq.faq_name,
                    			one_faq.separate_p,
                    			p_new_package_id
               	);

           	for entry in select * from faq_q_and_as
                                   where faq_id = one_faq.faq_id
           	loop

           		perform  faq__new_q_and_a (
                       		entry.faq_id,
                       		v_faq_id,
                       		entry.question,
                       		entry.answer,
                       		entry.sort_key
           	);
               end loop;
           end loop;
 return 0;
 end;
' language 'plpgsql';



 select acs_privilege__create_privilege('faq_view_faq');
 select acs_privilege__create_privilege('faq_create_faq');
 select acs_privilege__create_privilege('faq_delete_faq');
 select acs_privilege__create_privilege('faq_modify_faq');
 select acs_privilege__create_privilege('faq_view_q_and_a');
 select acs_privilege__create_privilege('faq_create_q_and_a');
 select acs_privilege__create_privilege('faq_delete_q_and_a');
 select acs_privilege__create_privilege('faq_modify_q_and_a');
 select acs_privilege__create_privilege('faq_admin_faq');
 select acs_privilege__create_privilege('faq_admin_q_and_a');
 select acs_privilege__add_child('faq_admin_faq', 'faq_view_faq');
 select acs_privilege__add_child('faq_admin_faq', 'faq_create_faq');
 select acs_privilege__add_child('faq_admin_faq', 'faq_delete_faq');
 select acs_privilege__add_child('faq_admin_faq', 'faq_modify_faq');
 select acs_privilege__add_child('faq_admin_q_and_a', 'faq_view_q_and_a');
 select acs_privilege__add_child('faq_admin_q_and_a', 'faq_create_q_and_a');
 select acs_privilege__add_child('faq_admin_q_and_a', 'faq_delete_q_and_a');
 select acs_privilege__add_child('faq_admin_q_and_a', 'faq_modify_q_and_a');
 select acs_privilege__add_child('faq_admin_faq', 'faq_admin_q_and_a');

 -- bind privileges to global names

 select acs_privilege__add_child('create','faq_create_faq');
 select acs_privilege__add_child('create','faq_create_q_and_a');
 select acs_privilege__add_child('write','faq_modify_faq');
 select acs_privilege__add_child('write','faq_modify_q_and_a');
 select acs_privilege__add_child('read','faq_view_faq');
 select acs_privilege__add_child('read','faq_view_q_and_a');
 select acs_privilege__add_child('delete','faq_delete_faq');
 select acs_privilege__add_child('delete','faq_delete_q_and_a');
 select acs_privilege__add_child('admin','faq_admin_faq');


create function inline_2 ()
returns integer as '
declare
	default_context 	acs_objects.object_id%TYPE;
	registered_users 	acs_objects.object_id%TYPE;
	the_public 				acs_objects.object_id%TYPE;
begin

  default_context = acs__magic_object_id(''default_context'');
  registered_users = acs__magic_object_id(''registered_users'');
  the_public = acs__magic_object_id(''the_public'');

  -- give the public the power to view faqs by default

  PERFORM acs_permission__grant_permission (default_context, the_public, ''faq_view_faq'');


  -- give the public the power to view q_and_as by default

  PERFORM acs_permission__grant_permission ( default_context,the_public, ''faq_view_q_and_a'');
  			
  return 0;

end;' language 'plpgsql';


select inline_2 ();

drop function inline_2 ();








