The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Pangloss::IO::YAML;

use strict;
use warnings;

use YAML qw( LoadFile Dump );
use Error qw( :try );
use File::Spec;
use Data::Random qw( rand_words rand_chars );

use Pangloss::Users;
use Pangloss::Terms;
use Pangloss::Concepts;
use Pangloss::Languages;
use Pangloss::Categories;

use base      qw( Pangloss::Object );
use accessors qw( languages categories users concepts terms );

our $VERSION  = ((require Pangloss::Version), $Pangloss::VERSION)[1];
our $REVISION = (split(/ /, ' $Revision: 1.5 $ '))[2];

sub init {
    my $self = shift;

    $self->languages( Pangloss::Languages->new )
         ->categories( Pangloss::Categories->new )
	 ->users( Pangloss::Users->new )
	 ->concepts( Pangloss::Concepts->new )
	 ->terms( Pangloss::Terms->new );

    return $self;
}

#------------------------------------------------------------------------------
# Save/Load

sub save {
    my $self = shift;
    die $self->class . "->save() not yet implemented!";
}

sub load {
    my $self = shift;
    my $file = shift || return;
    $self->{yaml_db} = LoadFile( $file );
    return $self->parse_db;
}

#------------------------------------------------------------------------------
# YAML DB parser

sub parse_db {
    my $self = shift;
    my $db   = shift || $self->{yaml_db};

    $self->emit( "parsing yaml database..." );

    my $src_lang = $self->get_or_create_source_lang;

    foreach my $concept (keys %$db) {
	$self->emit( "parsing concept '$concept'..." );
	my $c  = $self->get_or_create_concept( $concept );
	my $ct = $self->create_term( $c->key, $concept, $src_lang->key )
	  unless exists $db->{$concept}->{$src_lang->key};
	foreach my $lang (keys %{ $db->{$concept} }) {
	    my $term = $db->{$concept}->{$lang};
	    my $l    = $self->get_or_create_lang( $lang );
	    my $t    = $self->create_term( $c->key, $term, $l->key );
	}
    }

    return $self;
}

sub get_or_create_source_lang {
    my $self = shift;

    # we assume the db was written in english...
    # prolly a bad assumption, but it can be changed down the line.
    return $self->get_or_create_lang( 'en', 'English' );
}

sub get_or_create_lang {
    my $self = shift;
    my $key  = shift;
    my $name = shift;

    return $self->languages->get( $key )
      if $self->languages->exists( $key );

    my $l = Pangloss::Language->new
        ->iso_code( $key )
	->creator( 'admin' )
	->name( $name )
	->date( time );

    $self->languages->add( $l ); # die on error

    return $l;
}

sub get_or_create_concept {
    my $self    = shift;
    my $concept = shift;

    return $self->concepts->get( $concept )
      if $self->concepts->exists( $concept );

    my $c = Pangloss::Concept->new
          ->name( $concept )
	  ->creator( 'admin' )
	  ->date( time );

    $self->concepts->add( $c ); # die on error

    return $c;
}

sub create_term {
    my $self    = shift;
    my $concept = shift;
    my $name    = shift;
    my $lang    = shift;

    my $ct = Pangloss::Term->new
	  ->language( $lang )
	  ->concept( $concept )
	  ->name( $name )
	  ->creator( 'admin' )
	  ->date( time );

    try {
	$self->terms->add( $ct );
	return $ct;
    } catch Error with {
	warn 'error creating "' . $ct->key . '" - ' . shift() . "\n";
    };

    return;
}

1;