package OpusVL::SysParams::Schema::ResultSet::SysInfo;

use Moose;
extends 'DBIx::Class::ResultSet';
use JSON;


sub ordered
{
    my $self = shift;
    my $me = $self->current_source_alias;
    return $self->search(undef, {
        order_by => ["$me.label", "$me.name"],
    });
}



sub set
{
	my $self  = shift;
	my $name  = shift;
	my $value = shift;
    my $data_type = shift;

	my $info = $self->find_or_new({
        name  => $name,
    });

    $info->set_column(value => JSON->new->allow_nonref->encode($value));
    if ($data_type) {
        $info->set_column(data_type => $data_type);
    }

    if (! $info->data_type) {
        $info->set_type_from_value($value);
    }

    $info->update_or_insert;

	return $value;
}

sub get
{
	my $self = shift;
	my $name = shift;

	my $info = $self->find
	({
		name => $name
	});

	return $info ? JSON->new->allow_nonref->decode($info->value) : undef;
}

sub del 
{
	my $self = shift;
	my $name = shift;

	my $info = $self->find
	({
		name => $name
	});

	return $info ? $info->delete : undef;
}

sub key_names
{
    my $self = shift;

    return $self->search(undef, { order_by => 'name' })->get_column('name')->all;
}

1;

__END__

=pod

=encoding UTF-8

=head1 NAME

OpusVL::SysParams::Schema::ResultSet::SysInfo

=head1 VERSION

version 0.19

=head1 SYNOPSIS

This is the ResultSet that actually stores and gets results from DBIx::Class.

    $schema->resultset('SysInfo')->set('test.param', 1);
    $schema->resultset('SysInfo')->get('test.param');
    $schema->resultset('SysInfo')->del('test.param');

This is used by the L<OpusVL::SysParams> object.

=head1 METHODS

=head2 get

Get a system parameter. The key name will only be meaningful if the same string
has already been provided to L</set> at some point in the past, or created via
the L<OpusVL::AppKitX::SysParams> interface.

=head2 set

=over

=item B<$name>

=item B<$value>

=item B<$data_type>

=back

Set a system parameter.  The key name is simply a string.  It's suggested you use some 
kind of schema like 'system.key' to prevent name clashes with other unoriginal programmers.

The value and data type should correspond. A guess will be made, if you don't
provide the data type. Any value that can be JSON-encoded should work (i.e. no
CODE refs), but see L<OpusVL::SysParams::Schema::Result::SysInfo> for the list
of options for data type, and hence value type.

=head2 del

Delete a system parameter.

=head2 key_names

Returns the keys of the system parameters.

=head2 ordered

Returns a resultset with an ordering applied.

=head1 AUTHOR

OpusVL - www.opusvl.com

=head1 COPYRIGHT AND LICENSE

This software is copyright (c) 2011 - 2016 by OpusVL - www.opusvl.com.

This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.

=cut
