#!/usr/bin/perl

use Switch;

use warnings;
use strict;

package Addresses::DBI;
use base 'Class::DBI';

Addresses::DBI->connection(
    'dbi:Pg:dbname=address', # DBName
    '', # User
    '', # Password
    { AutoCommit => 1 }  # Options
);

package Addresses::Names;
use base 'Addresses::DBI';

Addresses::Names->table( 'names' );
Addresses::Names->columns(
    All => qw(id first last email)
);

# ----------------------------------------

sub PrintRow {
    my( $Row ) = @_;

    printf( "% 5d %-20s %-20s %-30s\n",
        $Row->id,
        $Row->first,
        $Row->last,
        $Row->email
    );
}

sub RetrieveAllWithIterator {
    my $Iterator = Addresses::Names->retrieve_all;
    while ( my $Row = $Iterator->next ) {
        PrintRow( $Row );
    }
}

sub SearchById {
    my( $id ) = @_;
    my $Iterator = Addresses::Names->search( id => $id );

    while ( my $Row = $Iterator->next ) {
        PrintRow( $Row );
    }
}

sub SearchLike {
    my( $criterion ) = @_;
    my $Iterator = Addresses::Names->search_like( first => $criterion );

    while ( my $Row = $Iterator->next ) {
        PrintRow( $Row );
    }
}

sub RetrieveById {
    my ( $id ) = @_;
    my $Row = Addresses::Names->retrieve( $id );
    if ( defined $Row ) {
        PrintRow( $Row );
    } else {
        print "Unable to access row with ID=$id\n";
    }
}

sub InsertData {
    my $Data = {
        first => 'Dummy Vorname',
        last  => 'Dummy Nachname',
        email => 'Dummy@nowhere.org'
    };

    my $Row = Addresses::Names->insert( $Data );

    print "Inserted:\n";
    PrintRow( $Row );

}

sub UpdateRow {
    my( $id ) = @_;
    my $Row = Addresses::Names->retrieve( $id );

    print "Old First Name: ", $Row->get( 'first' ), "\n";

    $Row->set( first => 'New Dummy Name' );
    $Row->update;
}

sub DeleteById {
    my( $id ) = @_;
    my $Row = Addresses::Names->retrieve( $id );
    $Row->delete;
    print "Row $id deleted\n";

}


my( $cmd, $id ) = @ARGV;

switch ( $cmd ) {
    case 'retrieve' {
        RetrieveById( $id );
    }
    case 'searchid' {
        SearchById( $id );
    }
    case 'searchlike' {
        SearchLike( $id );
    }
    case 'retrieveall' {
        RetrieveAllWithIterator;
    }
    case 'insert' {
        InsertData();
    }
    case 'update' {
        UpdateRow( $id );
        RetrieveById( $id );
    }
    case 'delete' {
        DeleteById( $id );
    }
}
