package Jifty::Subs::Render;
use strict;
use warnings;

=head1 NAME

Jifty::Subs::Render - Helper for subscriptions rendering

=head1 SYNOPSIS

  Jifty::Subs::Render->render($id, $callback);

=head1 DESCRIPTION



=head2 render($id, $callback)

Render all outstanding messges, and call C<$callback> with render
mode, region name, and content.

=cut

sub render {
    my ( $class, $id, $callback ) = @_;
    my $got;

    # # of fragments sent
    my $sent = 0;

    # Get the IPC::PubSub::Subscriber object and do one fetch of all new
    # events it subscribes to, and put those into $got.
    my $subs
        = Jifty->bus->modify( "$id-subscriber", sub { $got = $_ ? $_->get_all : {} } );

    return 0 unless %$got;

    # Now we the render options for those channels (calling ->modify instead
    # of ->fetch because we want to block if someone else is touching it;
    # it's equivalent to ->modify("$id-render", sub { $_ }).
    my $render = Jifty->bus->modify("$id-render");

    while ( my ( $channel, $msgs ) = each(%$got) ) {
        foreach my $rv (@$msgs) {

            # XXX - We don't yet use $timestamp here.
            my ( $timestamp, $msg ) = @$rv;



            # Channel name is always App::Event::Class-MD5QUERIES
            my $event_class = $channel;
            $event_class =~ s/-.*//;

            unless ( UNIVERSAL::can( $event_class => 'new' ) ) {
                Jifty->log->error("Receiving unknown event $event_class from the Bus");
                $event_class = Jifty->app_class("Event");
            }

            Jifty->log->debug("Rendering $channel event $msg");

            my $render_info = $render->{$channel};
            my $region      = Jifty::Web::PageRegion->new(
                name => $render_info->{region},
                path => $render_info->{render_with},
            );
            delete Jifty->web->{'regions'}{ $region->qualified_name };

            # Finally render the region.  In addition to the user-supplied arguments
            # in $render_info, we always pass the target $region and the event object
            # into its %ARGS.
            my $region_content = '';
            my $event_object   = $event_class->new($msg);
            $region->render_as_subrequest( \$region_content,
                {   %{ $render_info->{arguments} || {} },
                    event => $event_object,
                    $event_object->render_arguments,
                }
            );
            $callback->( $render_info->{mode}, $region->qualified_name, $region_content);
            $sent++;
        }
    }
    return ($sent);
}

1;
