#!perl
use Cassandane::Tiny;

sub test_allowdeleted
    :AllowDeleted :DelayedExpunge :Conversations
    ($self)
{
    my $store = $self->{store};
    my $talk = $store->get_client();

    my $subfolder = 'INBOX.foo';

    xlog $self, "First create a sub folder";
    $talk->create($subfolder)
        or die "Cannot create folder $subfolder: $@";
    $self->assert_str_equals('ok', $talk->get_last_completion_response());

    xlog $self, "Generate messages in $subfolder";
    $store->set_folder($subfolder);
    $store->_select();
    for (1..5) {
        $self->make_message("Message $subfolder $_");
    }
    $talk->unselect();
    $talk->select($subfolder);

    my $stat = $talk->status($subfolder, '(highestmodseq unseen messages)');
    $self->assert_equals(5, $stat->{unseen});
    $self->assert_equals(5, $stat->{messages});

    my $oldemailids = $talk->fetch('1:*', 'emailid');
    my @oldemailids = map { $oldemailids->{$_}{emailid}[0] } sort { $a <=> $b } keys %$oldemailids;

    $talk->store('1,3,5', '+flags', '(\\Deleted)');
    $talk->expunge();

    $stat = $talk->status($subfolder, '(highestmodseq unseen messages)');
    $self->assert_equals(2, $stat->{unseen});
    $self->assert_equals(2, $stat->{messages});

    xlog $self, "regular select finds 2 messages";
    $talk->unselect();
    $talk->select($subfolder);
    $self->assert_str_equals('ok', $talk->get_last_completion_response());
    $self->assert_num_equals(2, $talk->get_response_code('exists'));

    xlog $self, "include-expunged select finds 5 messages";
    $talk->unselect();
    # this API is janky
    $talk->select($subfolder, '(vendor.cmu-include-expunged)' => 1);
    $self->assert_str_equals('ok', $talk->get_last_completion_response());
    $self->assert_num_equals(5, $talk->get_response_code('exists'));

    my $newemailids = $talk->fetch('1:*', 'emailid');
    my @newemailids = map { $newemailids->{$_}{emailid}[0] } sort { $a <=> $b } keys %$newemailids;
    $self->assert_deep_equals(\@oldemailids, \@newemailids, Data::Dumper::Dumper(\@oldemailids, \@newemailids));

    xlog $self, "copy of deleted messages recreates them";
    $talk->copy('1,3,5', $subfolder);
    $talk->unselect();
    $talk->select($subfolder);
    $self->assert_str_equals('ok', $talk->get_last_completion_response());
    $self->assert_num_equals(5, $talk->get_response_code('exists'));

    xlog $self, "new mailbox contains the same emails";
    $newemailids = $talk->fetch('1:*', 'emailid');
    @newemailids = map { $newemailids->{$_}{emailid}[0] } sort { $a <=> $b } keys %$newemailids;
    $self->assert_deep_equals([sort @oldemailids], [sort @newemailids],
           Data::Dumper::Dumper([sort @oldemailids], [sort @newemailids]));
}
