###########################################
# Ticker.pm
# 2009, Mike Schilli <m@perlmeister.com>
###########################################
package PerlPanel::Applet::Ticker;
use strict;
use Log::Log4perl qw(:easy);

my $REFRESH  = 5 * 30_000;
my($CFG_FILE)= glob "~/.ticker-rc";
my $GETQUOTE = "/usr/bin/getquote";

Log::Log4perl->easy_init({ 
    level => $DEBUG,
    file  => ">>/tmp/ticker.log",
});

###########################################
sub new {
###########################################
  my($package) = @_;

  my $self = {};
  bless($self, $package);
  return $self;
}

###########################################
sub configure {
###########################################
  my($self) = @_;

  $self->{label} = 
              Gtk2::Label->new("Ticker");

  $self->{widget} = Gtk2::Button->new();
  $self->{widget}->signal_connect(
       'clicked', sub { 
               $self->stocks_update() });

  $self->{widget}->set_relief('none');
  $self->{widget}->add($self->{label});

  $self->{widget}->show_all;

  $self->stocks_update();

  PerlPanel::add_timeout(5 * 60_000, 
      sub { $self->stocks_update() ; 
            return 1 });

  return 1;
}

###########################################
sub symbols {
###########################################
  my @symbols = ();

  if(! open(FILE, "<$CFG_FILE")) {
      ERROR "Cannot open $CFG_FILE";
      return ();
  }

  while(<FILE>) {
      s/#.*//g;
      s/[^\w\.]//g;
      next if /^\s*$/;
      chomp;
      push @symbols, $_;
  }

  return @symbols;
}

###########################################
sub stocks_update {
###########################################
  my ($self) = @_;

  my($tag, $buffer);
  my $symbols = join " ", symbols();

  DEBUG "Updating '$symbols'";

  if($symbols eq "") {
      $self->{label}->set_markup(
                   "No symbols defined");
      return undef;
  }

  if (!open(COMMAND, 
            "$GETQUOTE $symbols |")) {
      $self->{label}->set_markup(
                   "Fetch failed ($!)");
      ERROR "Fetch failed ($!)";
      return undef;
  }

  $tag = Gtk2::Helper->add_watch(
    fileno(COMMAND), 'in', 
    sub {
      if (eof(COMMAND)) {
        DEBUG "Received data: $buffer";
        close(COMMAND);
        Gtk2::Helper->remove_watch($tag);
        $buffer =~ s/\n/ /g;
        $self->{label}->set_markup(
                                  $buffer);
      } else {
        $buffer .= <COMMAND>;
      }
    });

  return 1;
}

###########################################
sub expand { return 0; }
sub fill { return 0; }
sub widget { return $_[0]->{widget} }
sub get_default_config { return undef; }

1;
