#!/usr/bin/perl

sub rows
{
    local $s = $_[0];
    my @res = ();

    while ($s =~ m#.*?<tr>(.*?)</tr>#) {
	push(@res, $1);
	$s = $';
    }
    return @res;
}


sub cols
{
    local $s = $_[0];
    my @res = ();

    while ($s =~ m#.*?<td[^>]*>(.*?)</td>#) {
	push(@res, $1);
	$s = $';
    }
    return @res;
}


sub flush
{
    $cmd = "wget -nv -O - ".join(" ",
      map
      "http://search.digikey.com/scripts/DkSearch/dksus.dll?Detail\\&name=$_",
      @pn);
    $q .= `$cmd`;
    @pn = ();
}


sub usage
{
    print STDERR "usage: $0 (query [-i cache_file] | dsc | inv) [file ...]\n";
    exit(1);
}


$mode = shift @ARGV;
&usage unless $mode eq "query" || $mode eq "dsc" || $mode eq "inv";

if ($mode eq "query") {
    if ($ARGV[0] eq "-i") {
	shift @ARGV;
	$name = shift @ARGV;
	open(OLD, $name) || die "$name: $!";
	$q = join("", <OLD>);
	($old = $q) =~ tr/\r\n//d;
	close OLD;
    }

    while (<>) {
	chop;
	s/#.*//;
	next if /^\s*$/;
	next if /^\s/;
	s/\s.*//;

	$n++;
	print STDERR "$n\r" unless $n % 100;

	next if $old =~ m#align=right>Digi-Key Part Number</th><td>$_</td#;
	push(@pn, $_);
	&flush if @pn > 1000;
    }

    &flush if 0+@pn;;

    print $q;
    exit;
}


$q = join("", <>);
$q =~ tr/\r\n//d;

print "#DSC\n" if $mode eq "dsc";
print "#INV\n" if $mode eq "inv";
print "# MACHINE-GENERATED. DO NOT EDIT !\n";
print "# ", `date -u`;

for (split(/<!DOCTYPE HTML/, $q)) {
    next unless m#align=right>Digi-Key Part Number</th><td>([^<]+)</td#;
    $pn = $1;
    $qty = 0;
    if (m#align=right>Quantity Available</th><td[^>]*>([0-9,]+)<#) {
	($qty = $1) =~ tr/,//d;
    }
    next unless m#align=right>Description</th><td>(.*?)</td#;
    $dsc = $1;
    next unless m#<table.*<th>Price Break<(.*?)</table>#;
    if ($mode eq "dsc") {
	print "DIGI-KEY $pn $dsc\n";
	next;
    }
    print "DIGI-KEY $pn $qty USD";
    for (&rows($1)) {
	@c = &cols($_);
	next unless $c[0] =~ /^[0-9,]+$/;
	next unless $c[1] =~ /^[0-9.]+$/;
	$c[0] =~ tr/,//d;
	$c[1] =~ tr/,//d;	# let's hope we don't need this one often :)
	$c[1] =~ s/0+$// if $c[1] =~ /\./;
	print " $c[0] $c[1]";
    }
    print "\n";
}