The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

use strict;
use warnings;

use lib 'lib', '../lib'; #  XXX

use Test::More;

use JSON::PP;
use Data::Dumper;

# BEGIN { use_ok('WWW::Workflowy') }; # keeps the import magic from working
use WWW::Workflowy;

my $wf = WWW::Workflowy->new(
    outline => {
        'minutesSinceDateJoined' => 2882,
        'rootProjectChildren' => [
                                   {
                                     'lm' => 1259,
                                     'ch' => [
                                               {
                                                 'lm' => 1270,
                                                 'nm' => 'Test 2.1',
                                                 'id' => '63c98305-cd96-2016-4c4f-a20f7384ad9c'
                                               },
                                               {
                                                 'lm' => 1270,
                                                 'nm' => 'Test 2.2',
                                                 'id' => 'cf997f9e-2cef-aed8-d812-53be693f493e'
                                               },
                                               {
                                                 'lm' => 1270,
                                                 'ch' => [
                                                           {
                                                             'lm' => 1270,
                                                             'nm' => 'Test 2.3.1',
                                                             'id' => 'da52bd7b-87f9-6133-6254-c85547df4811'
                                                           },
                                                           {
                                                             'lm' => 1270,
                                                             'nm' => 'Test 2.3.2',
                                                             'id' => '2d06a022-f4ff-47d3-3180-43aeb4bbeabd'
                                                           }
                                                         ],
                                                 'nm' => 'Test 2.3',
                                                 'id' => 'e5932720-8811-e234-c35b-20f5ac7a83e3'
                                               }
                                             ],
                                     'nm' => 'Test2',
                                     'id' => '0da22641-65bf-9e96-70e7-dcc42c388cf3'
                                   },
                                   {
                                     'lm' => 1259,
                                     'ch' => [
                                               {
                                                 'lm' => 1285,
                                                 'nm' => 'Test 3.1 -- new!',
                                                 'id' => 'b18a71a4-91ec-d628-0fdf-97bc3264aace'
                                               },
                                               {
                                                 'lm' => 1285,
                                                 'nm' => 'aksjdhgkajshgsg',
                                                 'id' => 'bfd20738-461c-38a9-472f-0725d51c4b7e'
                                               }
                                             ],
                                     'nm' => 'Test3',
                                     'id' => '3d31a8f4-1dd5-dd5f-3af2-93e89a1e0763'
                                   }
                                 ],
        'dateJoinedTimestampInSeconds' => 1360996378,
        'initialMostRecentOperationTransactionId' => '106453325',
        'serverExpandedProjectsList' => [
                                          '0da22641',
                                          'e5932720'
                                        ],
        'rootProject' => {
                           'lm' => 1259,
                           'nm' => 'Test',
                           'id' => 'b141ebc1-4c8d-b31a-e3e8-b9c6c633ca25'
                         },
        'shareType' => 'url',
        'initialPollingIntervalInMs' => 10000,
        'isReadOnly' => bless( do{\(my $o = 0)}, 'JSON::PP::Boolean' ),
        'overQuota' =>  bless( do{\(my $o = 0)}, 'JSON::PP::Boolean' ),
    }, 
);
$wf->sync_changes->run_remote_operations->shared_projectid = 'b141ebc1-4c8d-b31a-e3e8-b9c6c633ca25';

my $concurrent_remote_operation_transactions = [
    '{"client_timestamp": 96134, "ppid": "4hTxEytH", "id": 128527449, "ops": [{"type": "create", "data": {"priority": 2, "projectid": "c23ef558-3b78-cd2e-59df-7e578cded1e1", "parentid": "0da22641-65bf-9e96-70e7-dcc42c388cf3"}, "server_data": {"shared_ancestor_ids_dict": {"c23ef558-3b78-cd2e-59df-7e578cded1e1": ":55877944:"}}}]}',
    '{"client_timestamp": 96134, "ppid": "paopgMgH", "id": 128527473, "ops": [{"type": "edit", "data": {"projectid": "c23ef558-3b78-cd2e-59df-7e578cded1e1", "name": "adding yet more stuff on the old Mac"}, "server_data": {"shared_ancestor_ids_dict": {"c23ef558-3b78-cd2e-59df-7e578cded1e1": ":55877944:"}}}, {"type": "create", "data": {"priority": 3, "projectid": "acafae16-c8f0-b7a6-d44c-4672f68815da", "parentid": "0da22641-65bf-9e96-70e7-dcc42c388cf3"}, "server_data": {"shared_ancestor_ids_dict": {"acafae16-c8f0-b7a6-d44c-4672f68815da": ":55877944:"}}}, {"type": "move", "data": {"priority": 0, "projectid": "acafae16-c8f0-b7a6-d44c-4672f68815da", "parentid": "c23ef558-3b78-cd2e-59df-7e578cded1e1"}, "server_data": {"shared_ancestor_ids_dict": {"acafae16-c8f0-b7a6-d44c-4672f68815da": ":55877944:", "c23ef558-3b78-cd2e-59df-7e578cded1e1": ":55877944:"}}}, {"type": "edit", "data": {"projectid": "acafae16-c8f0-b7a6-d44c-4672f68815da", "name": "tell me about it"}, "server_data": {"shared_ancestor_ids_dict": {"acafae16-c8f0-b7a6-d44c-4672f68815da": ":55877944:"}}}, {"type": "create", "data": {"priority": 1, "projectid": "40a5b129-afc9-d626-2792-6d68426a4870", "parentid": "c23ef558-3b78-cd2e-59df-7e578cded1e1"}, "server_data": {"shared_ancestor_ids_dict": {"40a5b129-afc9-d626-2792-6d68426a4870": ":55877944:"}}}]}',
    '{"client_timestamp": 96134, "ppid": "lEQtks39", "id": 128527505, "ops": [{"type": "edit", "data": {"projectid": "40a5b129-afc9-d626-2792-6d68426a4870", "name": "what goes on"}, "server_data": {"shared_ancestor_ids_dict": {"40a5b129-afc9-d626-2792-6d68426a4870": ":55877944:"}}}]}',
    # '{"client_timestamp": 96134, "ppid": "fB8DyH5u", "id": 128527561, "ops": [{"type": "edit", "data": {"projectid": "d789548d-ea28-ba88-0767-318618a7589d", "name": "Test 2.0 with stuff added to it plus more stuff - editing this on the old Mac"}, "server_data": {"shared_ancestor_ids_dict": {"d789548d-ea28-ba88-0767-318618a7589d": ":55877944:"}}}]}' # XXX can't handle editing nodes that don't exist; I wonder if there's fallback behavior of adding the node to the top level children or something; or maybe it just gets ignored
];

# my $run_operations = $result_json->{results}->[0]->{concurrent_remote_operation_transactions};  # as above:  an arrayref of strings

my $run_operations = $concurrent_remote_operation_transactions;


for my $run_op ( @$run_operations ) {
    my $decoded_run_op = decode_json $run_op or die;
# warn Data::Dumper::Dumper $decoded_run_op;
    # $run_remote_operations->( $run_op );
    $wf->sync_changes->run_remote_operations->( $decoded_run_op );
}

# print $wf->dump; # XXX

my ( $parent_node, $node, $priority, $siblings );

( $parent_node, $node, $priority, $siblings ) = WWW::Workflowy::_find_parent($wf->outline, 'c23ef558-3b78-cd2e-59df-7e578cded1e1');

ok $node;
ok $parent_node;
is $priority, 2;
is eval { $node->{id} } || $@, 'c23ef558-3b78-cd2e-59df-7e578cded1e1';
is eval { $node->{nm} } || $@,  "adding yet more stuff on the old Mac";
is eval { $parent_node->{id} } || $@, "0da22641-65bf-9e96-70e7-dcc42c388cf3";
ok $siblings;
ok grep( { $_->{id} eq 'cf997f9e-2cef-aed8-d812-53be693f493e' } @$siblings);
ok grep( { $_->{id} eq 'e5932720-8811-e234-c35b-20f5ac7a83e3' } @$siblings);

done_testing;