package LIMS::Model::Roles::DBIxSimple;

use Moose::Role;

use DateTime::Format::MySQL;
use LIMS::Local::DBIxSimple;
use Data::Dumper;

has params => ( is => 'rw', isa => 'HashRef', default => sub { {} } );
has constraints => (
    is         => 'ro',
    isa        => 'ArrayRef[Str]',
    traits     => ['Array'],
    default    => sub { [] },
	handles    => {
        all_constraints => 'elements', # array accessor
        add_constraint  => 'push',
    },
);
has bind_vars => (
    is         => 'ro',
    isa        => 'ArrayRef[Str]',
    traits     => ['Array'],
    default    => sub { [] },
    handles    => {
        add_bind_vars => 'push',
        all_bind_vars => 'elements',
    },
);
has constraint_title => ( is => 'rw', isa => 'Str' ); # for chart & template titles
has lims_dbix        => ( is => 'ro', isa => 'DBIx::Simple', lazy_build => 1 );

# requires 'lims_dbix'; # LIMS::Model::Base method

sub get_cols {
	my ($self, $table) = @_;
	
	my $dbh = $self->lims_dbix;
	
	my $meta = $self->dbix_get_meta($table); # warn Dumper $meta;
	
	my @cols = keys %$meta; # warn Dumper \@cols;
	return \@cols;
}

sub dbix_get_meta { # !!!!!!! keep distinct from Model::Base::get_meta_data()
	my ($self, $table) = @_;
	
	my $dbh = $self->lims_dbix;
	
	my $t = $dbh->query("show columns from $table")->hashes; # warn Dumper $t;
	
	my %meta = map { $_->{field} => $_ } @$t; # warn Dumper \%meta;	
	return \%meta;
}

sub get_enum_opts {
	my ($self, $table, $col) = @_;

	my $meta = $self->dbix_get_meta($table);
	
	my $col_type = $meta->{$col}->{type};
	
	my ($enum) = $col_type =~ /enum\((.*)\)/; # warn $enum;
	my @opts = sort grep { $_ =~ s/\'//g } split ',', $enum; # warn Dumper \@opts;
	return \@opts;
}

sub inflate_mysql_date_to_datetime {
	my $self = shift;
	my $date = shift; # warn $date;
	
	my $default = $self->lims_cfg->{settings}->{default_unknown_date}; # warn $default;	
	my $dto     = LIMS::Local::Utils::mysql_parse_date($date, $default);
	return $dto;
}

# plural of above:
sub inflate_mysql_dates_to_datetime {
	my $self = shift;
	my $data = shift; # hashref
	my $cols = shift; # array(ref) of cols to inflate
	
	my $default = $self->lims_cfg->{settings}->{default_unknown_date}; # warn $default;	
	my $to_dt   = sub { LIMS::Local::Utils::mysql_parse_date(shift, $default) };

	map { $data->{$_} = &$to_dt($data->{$_}) } grep $data->{$_}, @$cols;
	# warn Dumper $data; # no return value expected
}

sub inflate_mysql_timestamp_to_datetime {
	my $self = shift;
	my $data = shift; # hashref
	my $cols = shift; # array(ref) of cols to inflate
	
	map {
		$data->{$_} = DateTime::Format::MySQL->parse_datetime($data->{$_});
	} grep $data->{$_}, @$cols;	
}

#-------------------------------------------------------------------------------
sub _build_lims_dbix {
    my $self = shift;
    
	my $dbh = $self->lims_db->dbh;
	
	my $dbix = LIMS::Local::DBIxSimple->new($dbh);
    
    return $dbix;
}

1;