#
#   floof/floof/model/users.py
#
#   Copyright (c) 2009 Scribblr
#

# from elixir import Entity, Field, Unicode, belongs_to, has_many
from elixir import *
from search import GalleryWidget

class User(Entity):
    name = Field(Unicode(20))
    uploads = OneToMany('Art')
    has_many('identity_urls', of_kind='IdentityURL')
    searches = OneToMany('SavedSearch')
    # galleries = OneToMany('GalleryWidget')
    pages = OneToMany('UserPage', inverse="owner")
    primary_page = OneToOne('UserPage', inverse="owner")
    relationships = OneToMany('UserRelationship', inverse='user')
    target_of_relationships = OneToMany('UserRelationship', inverse='target_user')


    def __unicode__(self):
        return self.name

    def __init__(self, **kwargs):
        super(User, self).__init__(**kwargs)



        # TODO: have this clone a standard starter page
        self.primary_page = UserPage(owner=self, title="default", visible=True)

        # a starter gallery, just for fun
        gallery = GalleryWidget(owner=self, string="awesome")
        self.primary_page.galleries.append(gallery)


class IdentityURL(Entity):
    url = Field(Unicode(255))
    belongs_to('user', of_kind='User')



class UserPage(Entity):
    """A user can have multiple pages, though by default they only have one visible.
    This is so that they can keep some nice themed pages lying around for special occasions.
    Page templates that provide familiar interfaces will also be UserPage records.  Users will
    see a panel full of them, and they can choose to clone those template pages to their own page list.
    If more than one is set to visible, there would be tabs.

     """

    owner = ManyToOne('User', inverse="pages")
    title = Field(String)

    visible = Field(Boolean)
    galleries = OneToMany('GalleryWidget')


class UserRelationshipTypes(object):
    IS_WATCHING = 1

class UserRelationship(Entity):
    """Represents some sort of connection between users.

    For the moment, this means "watching".  Later, it may mean friending or
    ignoring.

    XXX: Watching should be made more general than this; it should have the
    power of an arbitrary query per watched artist without being unintelligible
    to users.
    """

    user = ManyToOne('User')
    target_user = ManyToOne('User')
    type = Field(Integer)  # UserRelationshipTypes above
