#!/usr/bin/perl -w

# Copyright 2001-2004 Six Apart. This code cannot be redistributed without
# permission from www.movabletype.org.
#
# $Id: run-periodic-tasks,v 1.5.2.1 2004/10/15 23:01:11 ezra Exp $

use strict;

use lib 'lib';
use lib 'extlib';

use constant VERBOSE => 0;

use MT;
use MT::Entry qw(:constants);
use MT::Util qw( offset_time_list );

my $mt = MT->new()
    or die MT->errstr;

for my $blog (MT::Blog->load) {
    my @ts = offset_time_list(time, $blog);
    my $now = sprintf "%04d%02d%02d%02d%02d%02d",
                      $ts[5]+1900, $ts[4]+1, @ts[3,2,1,0];
    print "Publishing entries for blog ", $blog->id, " up to ", $now, "\n"
        if VERBOSE;
    my $iter = MT::Entry->load_iter({blog_id => $blog->id,
                                     status => FUTURE},
                                    {'sort' => 'created_on',
                                     direction => 'descend'});
    my @queue;
    while (my $entry = $iter->()) {
        push @queue, $entry->id if $entry->created_on le $now;
    }

    my $changed = 0;
    my $total_changed = 0;
    my @results;
    my %rebuild_queue;
    foreach my $entry_id (@queue) {
        my $entry = MT::Entry->load($entry_id);
        print $entry->id, "\n" if VERBOSE;
        $entry->status(RELEASE);
        $entry->save
            or die $entry->errstr;

        $rebuild_queue{$entry->id} = $entry;
        my $n = $entry->next(1);
        $rebuild_queue{$n->id} = $n if $n;
        my $p = $entry->previous(1);
        $rebuild_queue{$p->id} = $p if $p;
        $changed++;
        $total_changed++;
    }
    if ($changed) {
        MT::Util::start_background_task(sub {
            my $rebuilt;
            foreach my $id (keys %rebuild_queue) {
                my $entry = $rebuild_queue{$id};
                $mt->rebuild_entry( Entry => $entry, Blog => $blog )
                    or die $mt->errstr;
                $rebuilt++;
            }
            print "Rebuilt $rebuilt entries\n" if VERBOSE;
        });
        $mt->rebuild_indexes( Blog => $blog )
            or die $mt->errstr;
    }
    print "$changed updated in blog ", $blog->id, "\n" if VERBOSE;
}

1;
