#!perl
use Cassandane::Tiny;

use Data::GUID qw(guid_string);

sub test_cardgroup_get_v4
    :min_version_3_9
    ($self)
{
    my $jmap = $self->{jmap};

    my $service = $self->{instance}->get_service("http");
    $ENV{DEBUGDAV} = 1;
    my $carddav = Net::CardDAVTalk->new(
        user => 'cassandane',
        password => 'pass',
        host => $service->host(),
        port => $service->port(),
        scheme => 'http',
        url => '/',
        expandurl => 1,
    );

    # get id of Default addressbook
    my $res = $jmap->CallMethods([['AddressBook/get', {}, "R1"]]);
    my $abookId = $res->[0][1]{list}[0]{id};

    for my $cards (qw( none prefix noprefix)) {
        my $id    = guid_string();
        my $uuid1 = guid_string();
        my $uuid2 = guid_string();

        my $member1 = "urn:uuid:$uuid1";
        my $member2 = "urn:uuid:$uuid2";

        if ($cards eq 'none') {
            # do nothing!
        } elsif ($cards eq 'prefix') {
            $self->default_user->contacts->create({ uid => $member1 });
            $self->default_user->contacts->create({ uid => $member2 });
        } elsif ($cards eq 'noprefix') {
            $self->default_user->contacts->create({ uid => $uuid1 });
            $self->default_user->contacts->create({ uid => $uuid2 });
        }

        my $href = "Default/$id.vcf";
        my $card = <<~"EOF";
        BEGIN:VCARD
        VERSION:4.0
        KIND:group
        UID:$id
        FN:The Doe Family
        MEMBER:$member1
        MEMBER:$member2
        END:VCARD
        EOF

        $card =~ s/\r?\n/\r\n/gs;
        $carddav->Request('PUT', $href, $card, 'Content-Type' => 'text/vcard');

        $res = $jmap->CallMethods([
            ['ContactCard/get', {
            }, 'R1']
        ]);

        my $want_jscard = {
            '@type' => 'Card',
            version => '1.0',
            addressBookIds => { $abookId => JSON::true },
            'cyrusimap.org:href' => $carddav->fullpath() . $href,
            uid => $id,
            kind => 'group',
            name => {
                full => 'The Doe Family'
            },
            members => {
                $member1 => JSON::true,
                $member2 => JSON::true
            }
        };

        my ($have_jscard) = grep {; $_->{uid} eq $id } $res->[0][1]{list}->@*;

        # Delete generated fields
        delete $have_jscard->{id};
        delete $have_jscard->{blobId};
        delete $have_jscard->{'cyrusimap.org:blobId'};
        delete $have_jscard->{'cyrusimap.org:size'};

        # Normalize and compare cards
        normalize_jscard($want_jscard);
        normalize_jscard($have_jscard);
        $self->assert_deep_equals($want_jscard, $have_jscard);
    }
}
