use strict;
use warnings;
use Test::More;
use HTML::FormHandler::Test;

use_ok('HTML::FormHandler::Blocks');
use_ok('HTML::FormHandler::Widget::Block');
use lib ('t/lib');

{
    package Test::Form;
    use HTML::FormHandler::Moose;
    extends 'HTML::FormHandler';

    has '+name' => ( default => 'test_form' );
    has '+widget_name_space' => ( default => sub {'Widget'} );
    sub build_render_list {
        ['header', 'foo', 'my_fieldset']
    }
    has_field 'foo';
    has_field 'bar';
    has_block 'my_fieldset' => ( tag => 'fieldset',
        render_list => ['bar'], label => 'My Special Bar' );
    has_block 'header' => ( type => 'Test' );
    sub validate_bar {
        my ( $self, $field ) = @_;
        $field->add_error('Wrong foo');
    }

}
my $form = Test::Form->new;
ok( $form, 'form built' );
my $block = $form->block('my_fieldset');
is( ref $block, 'HTML::FormHandler::Widget::Block', 'got a block' );
is_deeply( $form->render_list, ['header', 'foo', 'my_fieldset'], 'got a render list' );
is_deeply( $block->render_list, ['bar'], 'got a render list from the block' );
$form->process;
my $rendered = $form->render;
my $expected =
'<form id="test_form" method="post">
  <div class="form_messages"></div>
  <h2>You got to the Block! Congratulations.</h2>
  <div>
    <label for="foo">Foo</label>
    <input type="text" name="foo" id="foo" value="" />
 </div>
 <fieldset><legend>My Special Bar</legend>
   <div>
     <label for="bar">Bar</label>
     <input type="text" name="bar" id="bar" value="" />
   </div>
 </fieldset>
</form>';
is_html( $rendered, $expected, 'block rendered ok' );

$form->process( params => { foo => 'abc', bar => 'def' } );
ok( $form->has_errors, 'form has errors' );
$rendered = $form->field('bar')->render;
$expected =
'<div class="error">
  <label for="bar">Bar</label>
  <input type="text" name="bar" id="bar" value="def" class="error" />
  <span class="error_message">Wrong foo</span>
</div>';
is_html( $rendered, $expected, 'error formatted ok' );

done_testing;