--
--  Copyright (C) 2001, 2002 MIT
--
--  This file is part of dotLRN.
--
--  dotLRN is free software; you can redistribute it and/or modify it under the
--  terms of the GNU General Public License as published by the Free Software
--  Foundation; either version 2 of the License, or (at your option) any later
--  version.
--
--  dotLRN is distributed in the hope that it will be useful, but WITHOUT ANY
--  WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
--  FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
--  details.
--

--
-- create portals package
--
-- @author <a href="mailto:arjun@openforce.net">arjun@openforce.net</a>
-- @author <a href="mailto:yon@openforce.net">yon@openforce.net</a>
-- @creation-date 2001-10-01
-- @version $Id: portal-package-create.sql,v 1.1.1.1 2002/10/25 21:29:17 yon Exp $
--

select define_function_args('portal__new', 'portal_id,name,theme_id,template_id,object_type;portal,creation_date,creation_user,creation_ip,context_id');

create or replace function portal__new (integer,varchar,integer,integer,varchar,timestamp,integer,varchar,integer)
returns integer as '
declare
    p_portal_id                     alias for $1;
    p_name                          alias for $2;
    p_theme_id                      alias for $3;
    p_template_id                   alias for $4;
    p_object_type                   alias for $5;
    p_creation_date                 alias for $6;
    p_creation_user                 alias for $7;
    p_creation_ip                   alias for $8;
    p_context_id                    alias for $9;
    v_portal_id                     portals.portal_id%TYPE;
    v_theme_id                      portals.theme_id%TYPE;
    v_layout_id                     portal_layouts.layout_id%TYPE;
    v_page_id                       portal_pages.page_id%TYPE;
    v_page                          record;
    v_element                       record;
    v_param                         record;
    v_new_element_id                integer;
    v_new_parameter_id              integer;
begin

    v_portal_id := acs_object__new(
        p_portal_id,
        p_object_type,
        p_creation_date,
        p_creation_user,
        p_creation_ip,
        p_context_id,
        ''t''
    );

    if p_template_id is null then

        if p_theme_id is null then
            select max(theme_id)
            into v_theme_id
            from portal_themes;
        else
            v_theme_id := p_theme_id;
        end if;

        insert
        into portals
        (portal_id, name, theme_id)
        values
        (v_portal_id, p_name, v_theme_id);

    else

        -- we have a portal as our template. copy its theme, pages, layouts,
        -- elements, and element params.
        select theme_id
        into v_theme_id
        from portals
        where portal_id = p_template_id;

        insert
        into portals
        (portal_id, name, theme_id, template_id)
        values
        (v_portal_id, p_name, v_theme_id, p_template_id);

        -- now insert the pages from the portal template
        for v_page in select *
                      from portal_pages
                      where portal_id = p_template_id
        loop

            v_page_id := portal_page__new(
                null,
                v_page.name,
                v_portal_id,
                v_page.layout_id,
                null,
                p_creation_date,
                p_creation_user,
                p_creation_ip,
                v_portal_id
            );

            -- now get the elements on the templates page and put them on the new page
            for v_element in select *
                           from portal_elements
                           where page_id = v_page.page_id
            loop

                select portal_seq.nextval
                into v_new_element_id
                from dual;

                insert
                into portal_elements
                (element_id, name, page_id, datasource_id, region, sort_key, state, shadeable_p, hideable_p)
                select v_new_element_id, name, v_page_id, datasource_id, region, sort_key, state, shadeable_p, hideable_p
                from portal_elements
                where element_id = v_element.element_id;

                -- now for the elements params
                for v_param in select *
                             from portal_element_parameters
                             where element_id = v_element.element_id
                loop

                    select portal_seq.nextval
                    into v_new_parameter_id
                    from dual;

                    insert
                    into portal_element_parameters
                    (parameter_id, element_id, config_required_p, configured_p, key, value)
                    select v_new_parameter_id, v_new_element_id, config_required_p, configured_p, key, value
                    from portal_element_parameters
                    where parameter_id = v_param.parameter_id;

                end loop;

            end loop;

        end loop;

    end if;

    return v_portal_id;

end;' language 'plpgsql';

select define_function_args('portal__delete', 'portal_id');

create or replace function portal__delete (integer)
returns integer as '
declare
    p_portal_id                     alias for $1;
    v_page                          record;
begin

    for v_page in select page_id
                  from portal_pages
                  where portal_id = p_portal_id
    loop
        perform portal_page__delete(v_page.page_id);
    end loop;

    delete
    from portals
    where portal_id = p_portal_id;

    perform acs_object__delete(p_portal_id);

    return 0;

end;' language 'plpgsql';
