package Kwiki::Atom::Server;
use strict;
use base 'XML::Atom::Server';

sub client { $_[0]{client} = $_[1] if @_ > 1; $_[0]{client} }
sub print  { $_[0]{print} .= $_[1] if @_ > 1; $_[0]{print} }

*XML::Atom::Server::textValue = \&XML::Atom::Util::textValue;

sub xml_body {
    my $server = shift;
    unless (exists $server->{xml_body}) {
        $server->{xml_body} = XML::XPath->new(
            xml => $server->request_content
        );
    }
    $server->{xml_body};
}

sub handle_request {
    my $server = shift;
    my $self = $server->client;

#    local $SIG{__DIE__} = sub { print "\n\n@_\n"; exit };

    my $page;

    if ($server->request_method eq 'POST') {
        $page = $self->update_page or return undef;
        my $url = $server->uri;
        $self->fill_header(
            -status => 201,
            -location => "$url?action=atom_edit;page_id=".$page->id,
        );
        # $server->{is_soap} = 0;
        # return '';
    }
    else {
        $server->{cgi}->parse_params($ENV{QUERY_STRING});
        if (my $name = $self->utf8_decode($server->{cgi}->param('page_name'))) {
            $page = $self->pages->new_page( $self->pages->name_to_id($name) );
        }
        else {
            $page = $self->pages->current;
        }

        if ($server->request_method eq 'PUT') {
            $self->update_page($page);
        }
    }

    my $entry = $self->make_entry($page, 1);
    return $self->munge($entry->as_xml);
}

sub show_error {
    my $self = shift;
    $self->SUPER::show_error($self->{_error});
}

sub send_http_header { return }

1;