package History::SQLite;

use DBI;
use Cwd;

sub new {
    my ($class, %args) = @_;
    
    my $self = bless {
        db_path => $args{db_path} || 'command_history.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 command_history (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        command TEXT NOT NULL,
        timestamp DATETIME DEFAULT CURRENT_TIMESTAMP
    )
SQL
    
    $dbh->disconnect;
}

sub add {
    my ($self, $command) = @_;
    
    my $dbh = DBI->connect("dbi:SQLite:dbname=$self->{db_path}", "", "",
        { RaiseError => 1, PrintError => 0 });
    
    $dbh->do("INSERT INTO command_history (command) VALUES (?)", undef, $command);
    
    $dbh->disconnect;
}

sub get_all {
    my ($self) = @_;
    
    my $dbh = DBI->connect("dbi:SQLite:dbname=$self->{db_path}", "", "",
        { RaiseError => 1, PrintError => 0 });
    
    my $sth = $dbh->prepare("SELECT command FROM command_history ORDER BY timestamp");
    $sth->execute;
    
    my @commands;
    while (my $row = $sth->fetchrow_arrayref) {
        push @commands, $row->[0];
    }
    
    $dbh->disconnect;
    return @commands;
}

1;
