package App::Koyomi::DataSource::Semaphore::Teng::Data;

use strict;
use warnings;
use 5.010_001;
use Class::Accessor::Lite (
    ro => [qw/row ctx/],
);
use DateTime::Format::MySQL;
use Smart::Args;

use version; our $VERSION = 'v0.6.0';

{
    no strict 'refs';
    for my $column (qw/job_id number run_host run_pid/) {
        *{ __PACKAGE__ . '::' . $column } = sub {
            my $self = shift;
            $self->row->$column;
        };
    }
    # DATETIME => DateTime
    for my $column (qw/created_on run_date updated_at/) {
        *{ __PACKAGE__ . '::' . $column } = sub {
            my $self = shift;
            DateTime::Format::MySQL->parse_datetime($self->row->$column)
                ->set_time_zone($self->ctx->config->time_zone);
        };
    }
}

sub new {
    args(
        my $class,
        my $row => 'Teng::Row',
        my $ctx => 'App::Koyomi::Context',
    );
    bless +{
        row => $row,
        ctx => $ctx,
    }, $class;
}

sub update_with_condition {
    args(
        my $self,
        my $data  => 'HashRef',
        my $where => 'HashRef',
        my $ctx   => 'App::Koyomi::Context',
        my $now   => +{ isa => 'DateTime', optional => 1 },
    );
    $now ||= $ctx->now;
    my $teng = $self->row->handle;

    my %stash = %$data;
    my %cond  = %$where;
    for my $col (qw/created_on run_date updated_at/) {
        if ($where->{$col}) {
            $cond{$col} = DateTime::Format::MySQL->format_datetime($where->{$col});
        }
        if ($col eq 'updated_at') {
            $stash{$col} = DateTime::Format::MySQL->format_datetime($now);
            next;
        }
        if ($data->{$col}) {
            $stash{$col} = DateTime::Format::MySQL->format_datetime($data->{$col});
        }
    }

    my $txn = $teng->txn_scope;
    my $updated = $self->row->update(\%stash, \%cond);
    if ($updated) {
        $txn->commit;
        return 1;
    } else {
        $txn->rollback;
        return 0;
    }

}

1;
__END__

=encoding utf-8

=head1 NAME

App::Koyomi::DataSource::Semaphore::Teng::Data - Wrapper class to represents a record of semaphore datasource

=head1 SYNOPSIS

    use App::Koyomi::DataSource::Semaphore::Teng::Data;
    my $data = App::Koyomi::DataSource::Semaphore::Teng::Data->new(
        row => $row, # Teng::Row
        ctx => $ctx, # App::Koyomi::Context
    );

=head1 DESCRIPTION

Wrapper class of I<Teng::Row> for semaphore datasource.

=head1 SEE ALSO

L<App::Koyomi::DataSource::Semaphore::Teng>,
L<Teng::Row>

=head1 AUTHORS

YASUTAKE Kiyoshi E<lt>yasutake.kiyoshi@gmail.comE<gt>

=head1 LICENSE

Copyright (C) 2015 YASUTAKE Kiyoshi.

This library is free software; you can redistribute it and/or modify it under
the same terms as Perl itself.  That means either (a) the GNU General Public
License or (b) the Artistic License.

=cut