if {[expr ! [exists -proc class ]]} { package require oo }

class pkg {
	name		""
	latest		""
	descr		""
	installed	""
}

set ::pkgmeta {}

pkg method _load {nm} {
	set name $nm
	set info [join [split [exec /bin/opkg list $nm] "\n"] " "]
	regexp {^([^ ]+) - ([^ ]+) - (.*)$} $info full xname latest descr
	set info [exec /bin/opkg list-installed $nm]
	regexp {^([^ ]+) - ([^ ]+)$} $info full xname installed

	return $self
}

proc {pkg load} {nm} {
	return [[pkg] _load $nm]
}

pkg method is {what} {
	switch $what {
		installed {
			if {$installed eq ""} { return 0 }
			return 1
		}
		upgradable {
			if {$installed eq $latest} { return 0 }
			return 1
		}
	}
	return 0
}

proc {pkg avail} {} {
	set inst_pkgs [pkg inst]
	set avail_pkgs {}
	foreach pkg [split [exec /bin/opkg list] "\n"] {
		if [regexp {^ } $pkg] { continue }
		if {[regexp {^([^ ]+)} $pkg name] == 0} { continue }
		if {$name ni $inst_pkgs} { lappend avail_pkgs $name }
		#puts "New: $name<br>"
	}
	return $avail_pkgs
}

proc {pkg inst} {} {
	# Build a list of installed packages - just the names
	set inst_pkgs {}
	foreach pkg [split [exec /bin/opkg list-installed] "\n"] {
		if {[regexp {^([^ ]+)} $pkg name] == 0} { continue }
		lappend inst_pkgs $name
		#puts "Inst: $name<br>"
	}
	return $inst_pkgs
}

proc {pkg upgr} {} {
	#webif - 0.5.3 - 0.5.7
	set upgr_pkgs {}
	foreach pkg [split [exec /bin/opkg list-upgradable] "\n"] {
		if {[regexp {^([^ ]+)} $pkg name] == 0} { continue }
		lappend upgr_pkgs $name
		#puts "Upgr: $name<br>"
	}
	return $upgr_pkgs
}

proc {pkg loadmeta} {} {
	if {[llength $::pkgmeta]} { return }
	if {![file exists "/mod/var/pkg.meta"]} {
		pkg fetchmeta
	} else {
		set meta [open "/mod/var/pkg.meta" r]
		set ::pkgmeta [read $meta]
		$meta close
	}
}

proc {pkg fetchmeta} {} {
	set f [socket stream hummypkg.org.uk:80]
	$f puts -nonewline "GET /pkg.meta HTTP/1.1\r\n"
	$f puts -nonewline "Host: hummypkg.org.uk\r\n"
	$f puts -nonewline "\r\n"

	set line [string trim [$f gets]]
	while {[string length $line]} {
		set line [string trim [$f gets]]
	}
	set ::pkgmeta [$f read]
	$f close

	set ff [open "/mod/var/pkg.meta" w]
	puts $ff $::pkgmeta
	$ff close
}