BEGIN {
  use Test::Most;
  eval "use Catalyst 5.90090; 1" || do {
    plan skip_all => "Need a newer version of Catalyst => $@";
  };
}

use Test::Lib;
use HTTP::Request::Common;
use Catalyst::Test 'Example';

{
  ok my $body_parameters = [
    'person.first_name' => 2,
    'person.first_name' => 'John', # flatten array should just pick the last one
    'person.last_name' => 'Napiorkowski',
    'person.username' => 'jjn',
    'person.notes' => '{"test":"one", "foo":"bar"}',
    'person.maybe_array' => 'one',
    'person.maybe_array2' => 'one',
    'person.maybe_array2' => 'two',
    'person.indexed[0]' => 100,
    'person.indexed[1]' => 200,
    'person.indexed[]' => 300,
    'person.profile.address' => '15604 Harry Lind Road',
    'person.profile.birthday' => '2000-01-01',
    'person.profile.city' => 'Elgin',
    'person.profile.id' => 1,
    'person.profile.phone_number' => 16467081837,
    'person.profile.registered' => 0,
    'person.profile.registered' => 'sdfsdfsdfsd',
    'person.profile.state_id' => 2,
    'person.profile.status' => '',
    'person.profile.status' => 'pending',
    'person.profile.zip' => 78621,
    'person.credit_cards[0]._delete' => 0,
    'person.credit_cards[0].card_number' => 1231231231,
    'person.credit_cards[0].expiration' => '3000-01-01',
    'person.credit_cards[0].id' => 1,
    'person.credit_cards[1]._delete' => 0,
    'person.credit_cards[1].card_number' => 44444455555,
    'person.credit_cards[1].expiration' => '4000-01-01',
    'person.credit_cards[1].id' => 2,
    'person.credit_cards[1]._delete' => 0,
    'person.credit_cards[].card_number' => 888888899,
    'person.credit_cards[].expiration' => '5000-01-01',
    'person.credit_cards[].id' => 3,
    'person.person_roles[0]._nop' => 1,
    'person.person_roles[1].role_id' => 1,
    'person.person_roles[2].role_id' => 2, 
  ];

  ok my $res = request POST '/account/one', $body_parameters;
  ok my $data = eval $res->content;
 
  is_deeply $data, +{
    credit_cards => [
      {
        _delete => 0,
        card_number => "1231231231",
        expiration => "3000-01-01",
        id => 1,
      },
      {
        _delete => 0,
        card_number => "44444455555",
        expiration => "4000-01-01",
        id => 2,
      },
      {
        card_number => "888888899",
        expiration => "5000-01-01",
        id => 3,
      },
    ],
    empty => undef,
    empty_array => [],
    first_name => "John",
    indexed => [
      100,
      200,
      300,
    ],
    last_name => "Napiorkowski",
    maybe_array => "one",
    maybe_array2 => [
      "one",
      "two",
    ],
    notes => {
      foo => "bar",
      test => "one",
    },
    person_roles => [
      {
        role_id => 1,
      },
      {
        role_id => 2,
      },
    ],
    profile => {
      address => "15604 Harry Lind Road",
      birthday => "2000-01-01",
      city => "Elgin",
      id => 1,
      phone_number => "16467081837",
      registered => 1,
      state_id => 2,
      status => "pending",
      zip => 78621,
    },
    username => [
      "jjn",
    ],
  };
}

{
  ok my $body_parameters = [
    'person.first_name' => 2,
    'person.first_name' => 'John', # flatten array should just pick the last one
    'person.last_name' => 'Napiorkowski',
    'person.username' => 'jjn',
    'person.notes' => '{"test":"one", "foo":"bar"}',
    'person.maybe_array' => 'one',
    'person.maybe_array2' => 'one',
    'person.maybe_array2' => 'two',
    'person.person_roles[0]._nop' => 1,
    'person.person_roles[1].role_id' => 1,
    'person.person_roles[2].role_id' => 2, 
  ];

  ok my $res = request POST '/account/one', $body_parameters;
  ok my $data = eval $res->content;  

  is_deeply $data, +{
    empty => undef,
    empty_array => [],
    first_name => "John",
    last_name => "Napiorkowski",
    maybe_array => "one",
    maybe_array2 => [
      "one",
      "two",
    ],
    notes => {
      foo => "bar",
      test => "one",
    },
    person_roles => [
      {
        role_id => 1,
      },
      {
        role_id => 2,
      },
    ],
    username => [
      "jjn",
    ],
  };
}

{
  ok my $body_parameters = [
    'person.first_name' => 2,
    'person.first_name' => 'John', # flatten array should just pick the last one
    'person.last_name' => 'Napiorkowski',
  ];

  ok my $res = request POST '/account/one', $body_parameters;
  ok my $data =  $res->content;  
  is $res->code, 500;
}

{
  ok my $body_parameters = [
    username => 'jjn',
    password => 'abc123',
  ];

  ok my $res = request POST '/login', $body_parameters;
  ok my $data = eval $res->content;  
  is_deeply $data, +{
    password => "abc123",
    username => "jjn",
  };
}

{
  ok my $body_parameters = [
    'person.first_name' => 2,
    'person.first_name' => 'John', # flatten array should just pick the last one
    'person.last_name' => 'Napiorkowski',
    'person.username' => 'jjn',
    'person.notes' => '{"test":"one", "foo":"bar"}',
    'person.maybe_array' => 'one',
    'person.maybe_array2' => 'one',
    'person.maybe_array2' => 'two',
    'person.indexed[0]' => 100,
    'person.indexed[1]' => 200,
    'person.indexed[]' => 300,
    'person.profile.address' => '15604 Harry Lind Road',
    'person.profile.birthday' => '2000-01-01',
    'person.profile.city' => 'Elgin',
    'person.profile.id' => 1,
    'person.profile.phone_number' => 16467081837,
    'person.profile.registered' => 0,
    'person.profile.registered' => 'sdfsdfsdfsd',
    'person.profile.state_id' => 2,
    'person.profile.status' => '',
    'person.profile.status' => 'pending',
    'person.profile.zip' => 78621,
    'person.credit_cards[0]._delete' => 0,
    'person.credit_cards[0].card_number' => 1231231231,
    'person.credit_cards[0].expiration' => '3000-01-01',
    'person.credit_cards[0].id' => 1,
    'person.credit_cards[1]._delete' => 0,
    'person.credit_cards[1].card_number' => 44444455555,
    'person.credit_cards[1].expiration' => '4000-01-01',
    'person.credit_cards[1].id' => 2,
    'person.credit_cards[1]._delete' => 0,
    'person.credit_cards[].card_number' => 888888899,
    'person.credit_cards[].expiration' => '5000-01-01',
    'person.credit_cards[].id' => 3,
    'person.person_roles[0]._nop' => 1,
    'person.person_roles[1].role_id' => 1,
    'person.person_roles[2].role_id' => 2, 
  ];

  ok my $res = request POST '/account/two', $body_parameters;
  ok my $data = eval $res->content;
 
  is_deeply $data, +{
    credit_cards => [
      {
        _delete => 0,
        card_number => "1231231231",
        expiration => "3000-01-01",
        id => 1,
      },
      {
        _delete => 0,
        card_number => "44444455555",
        expiration => "4000-01-01",
        id => 2,
      },
      {
        card_number => "888888899",
        expiration => "5000-01-01",
        id => 3,
      },
    ],
    empty => undef,
    empty_array => [],
    first_name => "John",
    indexed => [
      100,
      200,
      300,
    ],
    last_name => "Napiorkowski",
    maybe_array => "one",
    maybe_array2 => [
      "one",
      "two",
    ],
    notes => {
      foo => "bar",
      test => "one",
    },
    person_roles => [
      {
        role_id => 1,
      },
      {
        role_id => 2,
      },
    ],
    profile => {
      address => "15604 Harry Lind Road",
      birthday => "2000-01-01",
      city => "Elgin",
      id => 1,
      phone_number => "16467081837",
      registered => 1,
      state_id => 2,
      status => "pending",
      zip => 78621,
    },
    username => [
      "jjn",
    ],
  };
}

{
  ok my $body_parameters = [
    'person.first_name' => 2,
    'person.first_name' => 'John', # flatten array should just pick the last one
    'person.last_name' => 'Napiorkowski',
    'person.username' => 'jjn',
    'person.notes' => '{"test":"one", "foo":"bar"}',
    'person.maybe_array' => 'one',
    'person.maybe_array2' => 'one',
    'person.maybe_array2' => 'two',
    'person.indexed[0]' => 100,
    'person.indexed[1]' => 200,
    'person.indexed[]' => 300,
    'person.profile.address' => '15604 Harry Lind Road',
    'person.profile.birthday' => '2000-01-01',
    'person.profile.city' => 'Elgin',
    'person.profile.id' => 1,
    'person.profile.phone_number' => 16467081837,
    'person.profile.registered' => 0,
    'person.profile.registered' => 'sdfsdfsdfsd',
    'person.profile.state_id' => 2,
    'person.profile.status' => '',
    'person.profile.status' => 'pending',
    'person.profile.zip' => 78621,
    'person.credit_cards[0]._delete' => 0,
    'person.credit_cards[0].card_number' => 1231231231,
    'person.credit_cards[0].expiration' => '3000-01-01',
    'person.credit_cards[0].id' => 1,
    'person.credit_cards[1]._delete' => 0,
    'person.credit_cards[1].card_number' => 44444455555,
    'person.credit_cards[1].expiration' => '4000-01-01',
    'person.credit_cards[1].id' => 2,
    'person.credit_cards[1]._delete' => 0,
    'person.credit_cards[].card_number' => 888888899,
    'person.credit_cards[].expiration' => '5000-01-01',
    'person.credit_cards[].id' => 3,
    'person.person_roles[0]._nop' => 1,
    'person.person_roles[1].role_id' => 1,
    'person.person_roles[2].role_id' => 2, 
  ];

  ok my $res = request POST '/account/three', $body_parameters;
  ok my $data = eval $res->content;
 
  is_deeply $data, +{
    first_name => "John",
    last_name => "Napiorkowski",
    username => [
      "jjn",
    ],
    aaa => "bbb",
    profile => {
      birthday => "2000-01-01",
      id => 1,
      registered => 1,
      status => "pending",
    },

  };
}

{
  ok my $body_parameters = [
    'person.first_name' => 2,
    'person.first_name' => 'John', # flatten array should just pick the last one
    'person.last_name' => 'Napiorkowski',
    'person.username' => 'jjn',
    'person.notes' => '{"test":"one", "foo":"bar"}',
    'person.maybe_array' => 'one',
    'person.maybe_array2' => 'one',
    'person.maybe_array2' => 'two',
    'person.indexed[0]' => 100,
    'person.indexed[1]' => 200,
    'person.indexed[]' => 300,
    'person.profile.address' => '15604 Harry Lind Road',
    'person.profile.birthday' => '2000-01-01',
    'person.profile.city' => 'Elgin',
    'person.profile.id' => 1,
    'person.profile.phone_number' => 16467081837,
    'person.profile.registered' => 0,
    'person.profile.registered' => 'sdfsdfsdfsd',
    'person.profile.state_id' => 2,
    'person.profile.status' => '',
    'person.profile.status' => 'pending',
    'person.profile.zip' => 78621,
    'person.credit_cards[0]._delete' => 0,
    'person.credit_cards[0].card_number' => 1231231231,
    'person.credit_cards[0].expiration' => '3000-01-01',
    'person.credit_cards[0].id' => 1,
    'person.credit_cards[1]._delete' => 0,
    'person.credit_cards[1].card_number' => 44444455555,
    'person.credit_cards[1].expiration' => '4000-01-01',
    'person.credit_cards[1].id' => 2,
    'person.credit_cards[1]._delete' => 0,
    'person.credit_cards[].card_number' => 888888899,
    'person.credit_cards[].expiration' => '5000-01-01',
    'person.credit_cards[].id' => 3,
    'person.person_roles[0]._nop' => 1,
    'person.person_roles[1].role_id' => 1,
    'person.person_roles[2].role_id' => 2, 
  ];

  ok my $res = request POST '/account/four', $body_parameters;
  ok my $data = eval $res->content;
 
  is_deeply $data, +{
    birthday => "2000-01-01",
    id => 1,
    registered => 1,
    status => "pending",
  };
}

done_testing;