#!/bin/sh
# Restart with tclsh\
exec tclsh "$0" ${1+"$@"}

package require sqlite3

proc main {} {
    sqlite3 db rixter.db

    while {1} {
        puts -nonewline "-> "
        flush stdout

        set line [gets stdin]

        if {[catch {llength $line}]} {
            puts "Error: not a Tcl list"
            continue
        }

        switch -- [lindex $line 0] {
        show {
            if {[llength $line] == 1} {
                puts "[format %-30s Name] Address"
                puts "[string repeat - 29] [string repeat - 29]"
                foreach {name addr} [db eval {
                        select name, addr from addressbook order by name}] {
                    puts "[format %-30s $name] $addr"
                }
            } elseif {[llength $line] == 3} {
                switch -- [lindex $line 1] {
                name {
                    set name [lindex $line 2]
                    puts "[format %-30s Name] Address"
                    puts "[string repeat - 29] [string repeat - 29]"
                    foreach {name addr} [db eval {
                            select name, addr from addressbook
                            where name = $name order by name}] {
                        puts "[format %-30s $name] $addr"
                    }
                } addr {
                    set addr [lindex $line 2]
                    puts "[format %-30s Name] Address"
                    puts "[string repeat - 29] [string repeat - 29]"
                    foreach {name addr} [db eval {
                            select name, addr from addressbook
                            where addr = $addr order by name}] {
                        puts "[format %-30s $name] $addr"
                    }
                } default {
                    puts "Error: unknown criterion"
                }}
            } else {
                puts "Error: wrong number of arguments"
            }
        } add {
            if {[llength $line] != 3} {
                puts "Error: wrong number of arguments"
            } else {
                set name [lindex $line 1]
                set addr [lindex $line 2]
                db eval {insert into addressbook values($name, $addr)}
            }
        } del {
            if {[llength $line] == 3} {
                switch -- [lindex $line 1] {
                name {
                    set name [lindex $line 2]
                    db eval {delete from addressbook where name = $name}
                } addr {
                    set addr [lindex $line 3]
                    db eval {delete from addressbook where addr = $addr}
                } default {
                    puts "Error: unknown criterion"
                }}
            } else {
                puts "Error: wrong number of arguments"
            }
        } help {
            puts "show            - display all records"
            puts "show name \$name - display records with name \$name"
            puts "show addr \$addr - display records with address \$addr"
            puts "add \$name \$addr - add \$name/\$addr to the addressbook"
            puts "del name \$name  - delete record(s) with name \$name"
            puts "del addr \$addr  - delete record(s) with address \$addr"
            puts "quit            - quit the program"
            puts "help            - display this message"
        } quit - exit - bye {
            break
        } default {
            puts "Error: unrecognized command; try \"help\""
        }}
    }

    db close
}

main

# vim: set ts=4 sts=4 sw=4 tw=80 et:
