#!/usr/bin/env python

import sqlalchemy
from turboentity import *
from turboentity import objectstore

metadata = sqlalchemy.BoundMetaData("sqlite:///:memory:")


class Genre (Entity):
    title = Column(Unicode(30))
    movies = ManyToMany("Movie")


class Movie (Entity):   
    title = Column(Unicode(50))
    year = Column(Integer)
    genres = ManyToMany("Genre")
    director = ManyToOne("Director")
    actors = ManyToMany("Actor")
    
    @property
    def genre(self):
        return " / ".join(genre.title for genre in self.genres)


class Artist (Entity):
    firstname = Column(Unicode(30))
    lastname = Column(Unicode(30))
    birthdate = Column(Date)
    
    @property
    def name(self):
        return self.firstname +" "+ self.lastname

class Director (Artist):
    movies = OneToMany("Movie")


class Actor (Artist):
    movies = ManyToMany("Movie")



def main():
    create_all()
    
    scifi = Genre(title="Science-Fiction")
    fantasy = Genre(title="Fantasy")
    horror = Genre(title="Horror")
    
    rscott = Director(lastname="Scott", firstname="Ridley")
    glucas = Director(lastname="Lucas", firstname="George")
    
    sweaver = Actor(lastname="Weaver", firstname="Sigourney")
    hford = Actor(lastname="Ford", firstname="Harrison")
    syoung = Actor(lastname="Young", firstname="Sean")
    mhamill = Actor(lastname="Hamill", firstname="Mark")
    cfisher = Actor(lastname="Fisher", firstname="Carrie")
    
    blade_runner = Movie(title="Blade Runner", year=1982)
    blade_runner.actors.append(hford)
    blade_runner.actors.append(syoung)
    blade_runner.director = rscott
    
    alien = Movie(title="Alien", year=1979)
    alien.actors.append(sweaver)
    alien.director = rscott
    
    star_wars = Movie(title="Star Wars", year=1977)
    star_wars.actors.append(cfisher)
    star_wars.actors.append(hford)
    star_wars.actors.append(mhamill)
    star_wars.director = glucas
    star_wars.genres.append(scifi)
    star_wars.genres.append(fantasy)
    
    scifi.movies.append(blade_runner)
    scifi.movies.append(alien)
    
    alien.genres.append(horror)
    
    objectstore.flush()
    objectstore.clear()
    
    
    for movie in Movie.select():
        print "Movie:       %s" % movie.title
        print "Year:        %d" % movie.year
        print "Genre:       %s" % movie.genre
        print "Directed by: %s" % movie.director.name
        print "Cast:        %s,.." % ", ".join(actor.name
                                            for actor in movie.actors)
        print
    

if __name__ == '__main__':
    main()

