package Environment::SQLite;

use DBI;
use Cwd;

sub new {
    my ($class, %args) = @_;
    
    my $self = bless {
        db_path => $args{db_path} || 'pshell_env.db'
    }, $class;
    
    # Convert to absolute path
    $self->{db_path} = getcwd() . '/' . $self->{db_path} unless $self->{db_path} =~ m|^/|;
    
    $self->_init_db;
    
    return $self;
}

sub _init_db {
    my ($self) = @_;
    
    my $dbh = DBI->connect("dbi:SQLite:dbname=$self->{db_path}", "", "",
        { RaiseError => 1, PrintError => 0 });
    
    $dbh->do(<<"SQL");
    CREATE TABLE IF NOT EXISTS environment (
        name TEXT PRIMARY KEY,
        value TEXT NOT NULL
    )
SQL
    
    $dbh->disconnect;
}

sub set {
    my ($self, $name, $value) = @_;
    
    my $dbh = DBI->connect("dbi:SQLite:dbname=$self->{db_path}", "", "",
        { RaiseError => 1, PrintError => 0 });
    
    $dbh->do("REPLACE INTO environment (name, value) VALUES (?, ?)", undef, $name, $value);
    
    $dbh->disconnect;
}

sub get {
    my ($self, $name) = @_;
    
    my $dbh = DBI->connect("dbi:SQLite:dbname=$self->{db_path}", "", "",
        { RaiseError => 1, PrintError => 0 });
    
    my ($value) = $dbh->selectrow_array(
        "SELECT value FROM environment WHERE name = ?", undef, $name);
    
    $dbh->disconnect;
    return $value;
}

sub get_all {
    my ($self) = @_;
    
    my $dbh = DBI->connect("dbi:SQLite:dbname=$self->{db_path}", "", "",
        { RaiseError => 1, PrintError => 0 });
    
    my $sth = $dbh->prepare("SELECT name, value FROM environment");
    $sth->execute;
    
    my %env;
    while (my $row = $sth->fetchrow_arrayref) {
        $env{$row->[0]} = $row->[1];
    }
    
    $dbh->disconnect;
    return %env;
}

1;
