package MooseX::Semantic::Util::SchemaExport;
use Moose;
use RDF::Trine qw(iri statement);
use RDF::NS;
use Data::Dumper;
use RDF::NS '20111124';

my $ns = RDF::NS->new('20111124');

our %moose_type_to_rdf_range = (
    Str => iri $ns->xsd('string'),
    'ArrayRef[Str]' => iri $ns->xsd('string'),
);

sub extract_ontology {
    my $cls = shift;
    my ($obj) = @_;
    return unless $obj->does('MooseX::Semantic::Role::WithRdfType');
    return unless $obj->does('MooseX::Semantic::Role::Resource');
    # warn Dumper "I LIVE";
    my $obj_type = $obj->rdf_type->[0];
    my $ont_model = RDF::Trine::Model->temporary_model;
    $obj->_walk_attributes({
        literal => sub {
            my ($attr, $val, $attr_name, $rels) = @_;
            # my $range = $obj->_find_parent_type( $attr, sub { $moose_type_to_rdf_range{ shift() } });
            # my $range = $obj->_find_parent_type( $attr, 'Str');
             # warn Dumper $range;
        },
        schema => sub {
            my ($attr) = @_;
            warn Dumper $attr->name ;
            # my $range = $obj->_find_parent_type( $attr, sub { $moose_type_to_rdf_range{ shift() } });
            # my $range = $obj->_find_parent_type( $attr, 'Str');
            my $moose_type =  $attr->type_constraint->name;
            my $rdf_type = $moose_type_to_rdf_range{ $moose_type };
            # warn Dumper keys %{$attr };
            # return unless $rdf_type;
            # warn Dumper $attr->uri;
            # warn Dumper $rdf_type;
            # warn Dumper $ns->rdf('type');
            if ($rdf_type) {
                $ont_model->add_statement( statement(
                        $attr->uri,
                        iri($ns->rdf('range')),
                        $rdf_type
                    )
                );
            }
            if ($attr->{required}) {
                $ont_model->add_statement( statement(
                        $attr->uri,
                        iri($ns->owl('minCardinality')),
                        $rdf_type
                    )
                );
            }
        }
    });

    # $ont_model->add_statement( RDF::Trine::Statement->new(
    #     $_,
    #     $ns->rdf('type'),

    return $ont_model;
}


__PACKAGE__->meta->make_immutable;
1;