use strict;
use warnings;

package MyProj::Data;

use parent 'DBIx::Sunny';
use Mouse::Util::TypeConstraints;
  
subtype 'Natural'
    => as 'Int'
    => where { $_ > 0 };

subtype 'Uint'
    => as 'Int'
    => where { $_ >= 0 };

no Mouse::Util::TypeConstraints;

__PACKAGE__->select_one(
    'version',
    'SELECT VERSION()'
);

__PACKAGE__->query(
    'init_table',
    <<SQL);
CREATE TABLE IF NOT EXISTS fuga (
  id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
  data VARCHAR(12)
)
SQL

__PACKAGE__->query(
    'add_data',
    data => 'Str',
    'INSERT INTO fuga (data) VALUES (?)',
);

__PACKAGE__->select_row(
    'get_data',
    id => 'Natural',
    'SELECT * FROM fuga WHERE id = ?'
);

__PACKAGE__->select_all(
    'get_recent_data',
    offset => { isa => 'Uint', default => 0 },
    limit => { isa => 'Uint', default => 10 },
    'SELECT * FROM fuga ORDER BY id DESC LIMIT ?,?'
);


package main;

use Log::Minimal;

local $Log::Minimal::AUTODUMP = 1;
local $Log::Minimal::PRINT = sub {
    my ( $time, $type, $message, $trace) = @_;
    print "$time [$type] $message at $trace\n";
};

my $db = MyProj::Data->new(
    dbh => DBI->connect('dbi:mysql(RaiseError=>1,PrintError=>0):test')
);

print "OK" if $db->init_table;
print $db->version;

my $ret;

$ret = $db->add_data( data => 'fugafuga' );
print "OK" if $ret > 0;
my $last_insert_id = $db->last_insert_id;
print $last_insert_id;

my $row;
$row = $db->get_data( id => $last_insert_id );
infof($row);

eval {
    $row = $db->get_data( id => 'abc' );
};
print $@;

eval {
    $row = $db->get_data( id => 0 );
};
print $@;

$row = $db->get_recent_data( limit => 20 );
infof($row);

$row = $db->get_recent_data( offset => 10 );
infof($row);


#$db->query("insert into fuga (data) values (?)","\x{58f9}");
#print $db->last_insert_id;
#print $db->select_one("select data from fuga order by id desc limit 1");
#print "OK";
#
#$db->queryf("insert into fuga (data) values (%s)","\x{5f10}");
#print $db->selectf_one("select data from fuga order by id desc limit %d",1);
#print "OK";
#