#!perl
# vim:ts=4:sw=4:et:ft=perl:

use strict;
use warnings;
use Test::More tests => 32;
use lib qw( t/lib );
use Utils;

package MyData;
use strict;
use warnings;
use Data::Object::AutoWrap qw( data );

sub new {
    my ( $class, $data ) = @_;
    bless { data => $data }, $class;
}

package main;

{
    my $chunk = { name => 'chunk', hours => [ 3, 6, 9, 12 ] };
    my $data = {
        one   => 1,
        two   => 2,
        three => 3,
        hash  => {
            smaller => '>|<',
            larger  => '< >',
        },
        array => [
            1, 'string',
            {
                here  => 'there',
                array => [ 'one', 'two', 'three' ],
                chunk => $chunk
            },
            [ 2, 3, 4, ],
            $chunk,
        ],
        chunk  => $chunk,
        deeper => [ 'scalar', ['array'], { a => 'hash' } ],
    };

    my $snap = bake( $data );
    # diag $snap;
    ok my $d = MyData->new( $data ), 'new';
    isa_ok $d, 'MyData';
    can_ok $d, 'one';
    can_ok $d, 'new';
    is $d->one,   1, 'one';
    is $d->two,   2, 'two';
    is $d->three, 3, 'three';
    eval { $d->four };
    like $@,
      qr{Undefined subroutine &MyData::four called at \S+autowrap\.t line \d+},
      'four';

    ok my $hash = $d->hash, 'hash';
    isa_ok $hash, 'Data::Object::AutoWrap::Hash';
    is $hash->smaller, '>|<', 'smaller';

    is $d->hash->smaller, '>|<', 'smaller';
    is $d->hash->larger,  '< >', 'larger';
    can_ok $d->hash, 'larger';

    is $d->array( 0 ), 1, 'array -> scalar';
    is $d->array( 3, 0 ), 2, 'array -> array -> scalar';
    is $d->array( 2 )->here, 'there', 'array -> hash -> scalar';
    is $d->array( 2, 'here' ), 'there', 'array -> hash -> scalar 2';
    is $d->array( 2 )->array( 2 ), 'three',
      'array -> hash -> array -> scalar';
    is $d->array( 2, 'array', 2 ), 'three',
      'array -> hash -> array -> scalar 2';

    # Reused chunk
    is $d->chunk->name, 'chunk', 'chunk';
    is $d->chunk->hours( 1 ), 6, 'hours';
    is $d->array( 4 )->name, 'chunk', 'chunk 2';
    is $d->array( 4 )->hours( 1 ), 6, 'hours 2';
    is $d->array( 2 )->chunk->name, 'chunk', 'chunk 3';
    is $d->array( 2 )->chunk->hours( 1 ), 6, 'hours 3';

    # List context
    is_deeply [ $d->array( 3 ) ], [ 2, 3, 4 ],
      'list context array accessor';
    is_deeply [ $d->chunk->hours ], $chunk->{hours},
      'another list context';

    my @deeper = $d->deeper;
    # use Data::Dumper;
    # diag Dumper( \@deeper );
    is $deeper[0], 'scalar', 'scalar from list';
    is_deeply $deeper[1], ['array'], 'array from list';
    is $deeper[2]->a, 'hash', 'hash from list';

    is bake( $data ), $snap, 'data unmolested';
}
