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

use Test::More tests => 4;

use HTML::FormFu;

my $form = HTML::FormFu->new(
    { tt_args => { INCLUDE_PATH => 'share/templates/tt/xhtml' } } );

$form->element('Checkbox')->name('bar')->value('y');

$form->auto_fieldset(1);

$form->default_model('HashRef');

$form->populate( {
        elements => [ {
                type         => "DateTime",
                name         => "datetime",
                auto_inflate => 1,
                year         => { list => [1999] }
            },
            {   name     => "inflator",
                deflator => { type => 'Strftime', strftime => '%F %H:%M' },
                inflator =>
                    { type => "DateTime", parser => { strptime => '%F' } }
            },
            {   type        => "Repeatable",
                nested_name => "many",
                elements    => [
                    { name => "id" },
                    {   type     => "Block",
                        name     => "nested",
                        elements => [ { type => "Text", name => "foo" } ] } ]
            },
            {   type    => "Select",
                name    => "single-select",
                options => [ [qw(1 foo)], [qw(2 bar)] ]
            },
            {   type    => "Select",
                name    => "multi-select",
                options => [ [qw(1 foo)], [qw(2 bar)] ]
            },
            {   type        => "Block",
                nested_name => "nested",
                elements    => [ { type => "Text", name => "foo" } ]
            },
            {   type     => "Multi",
                name     => "address",
                elements => [ { name => "street" }, { name => "number" } ]
            },
            {   type     => "Multi",
                name     => "address-split",
                elements => [ { name => "street" }, { name => "number" } ],
                deflators => [ { type => "CompoundSplit" } ]
            },
            {   type => "SimpleTable",
                rows => [ [ { name => "table1" } ] ] } ] } );

$form->auto_fieldset(0);

$form->model->default_values( {
        datetime => '30-08-1999 22:00',
        bar      => 'y',
        many     => [ { id => 1, foo => "bar" }, { id => 2, foo => "baz" } ],
        'single-select' => 1,
        'inflator'      => '2008-09-22',
        'multi-select'  => [ 1, 2 ],
        nested          => { foo => "bar" },
        address         => { street => "Lombardstreet", number => 22 },
        'address-split' => "Lombardstreet 22",
        table1          => "test"
    } );

$form->process;

is_deeply(
    $form->model->create,
    {   bar  => 'y',
        many => [ { id => 1, foo => "bar" }, { id => 2, foo => "baz" } ],
        'single-select'   => 1,
        'datetime_year'   => 1999,
        'datetime_minute' => '00',
        'datetime_month'  => 8,
        'datetime_day'    => 30,
        'datetime_hour'   => '22',
        'datetime'        => '30-08-1999 22:00',
        'multi-select'    => [ 1, 2 ],
        nested            => { foo => "bar" },
        address           => { street => "Lombardstreet", number => 22 },
        'address-split'   => { street => "Lombardstreet", number => 22 },
        table1            => "test",
        inflator          => '2008-09-22 00:00'
    } );

$form->model->options(1);

is_deeply(
    $form->model->create,
    {   bar  => 'y',
        many => [ { id => 1, foo => "bar" }, { id => 2, foo => "baz" } ],
        'single-select' => { value => 1, label => "foo" },
        'multi-select' =>
            [ { value => 1, label => "foo" }, { value => 2, label => "bar" } ],
        nested          => { foo    => "bar" },
        address         => { street => "Lombardstreet", number => 22 },
        'address-split' => { street => "Lombardstreet", number => 22 },
        table1         => "test",
        'datetime_day' => {
            'value' => 30,
            'label' => 30
        },
        'datetime'        => '30-08-1999 22:00',
        'datetime_minute' => {
            'value' => '00',
            'label' => '00'
        },
        'datetime_month' => {
            'value' => 8,
            'label' => 'August'
        },
        'datetime_hour' => {
            'value' => '22',
            'label' => '22'
        },
        'datetime_year' => {
            'value' => '1999',
            'label' => '1999'
        },
        inflator => '2008-09-22 00:00'
    } );

$form->model->flatten(1);

$form->model->inflators(1);

is_deeply(
    $form->model->create,
    {   'datetime_month.label'  => 'August',
        'multi-select_0.label'  => 'foo',
        'datetime_hour.value'   => '22',
        'datetime_minute.value' => '00',
        'multi-select_0.value'  => '1',
        'address-split.street'  => 'Lombardstreet',
        'datetime'              => '30-08-1999 22:00',
        'table1'                => 'test',
        'many_2.foo'            => 'baz',
        'bar'                   => 'y',
        'datetime_hour.label'   => '22',
        'address-split.number'  => '22',
        'many_1.foo'            => 'bar',
        'many_2.id'             => 2,
        'datetime_year.label'   => 1999,
        'single-select.label'   => 'foo',
        'address.number'        => 22,
        'address.street'        => 'Lombardstreet',
        'inflator'              => '2008-09-22 00:00',
        'datetime_day.value'    => 30,
        'datetime_minute.label' => '00',
        'single-select.value'   => '1',
        'datetime_month.value'  => 8,
        'datetime_year.value'   => 1999,
        'datetime_day.label'    => 30,
        'nested.foo'            => 'bar',
        'multi-select_1.label'  => 'bar',
        'many_1.id'             => 1,
        'multi-select_1.value'  => '2'
    } );

$form->model->flatten(0);

$form->model->default_values( {
        many => [ { id => undef } ],
        bar  => 'zzz',
    } );

is_deeply(
    $form->model->create,
    {   'inflator'      => undef,
        'single-select' => { value => undef, label => undef },
        'datetime_hour' => { value => undef, label => undef },
        'address-split' => {
            'number' => undef,
            'street' => undef
        },
        'many' => [ { id => undef, foo => undef } ],
        'datetime_day'    => { value => undef, label => undef },
        'nested'          => { 'foo' => undef },
        'datetime'        => undef,
        'datetime_year'   => { value => undef, label => undef },
        'table1'          => undef,
        'bar'             => 'zzz',
        'datetime_minute' => { value => undef, label => undef },
        'address'         => {
            'number' => undef,
            'street' => undef
        },
        'multi-select'   => { value => undef, label => undef },
        'datetime_month' => { value => undef, label => undef } } );