from time import sleep
from datetime import datetime

from pylons import c
from pymongo.errors import OperationFailure

from ming import schema
from ming.orm.property import FieldProperty
from pyforge.model import VersionedArtifact, Snapshot, Message

class MyArtifactHistory(Snapshot):
    class __mongometa__:
        name='my_artifact_history'
    type_s='MyArtifact Snapshot'

    def original(self):
        return MyArtifact.query.get(_id=self.artifact_id)

    def shorthand_id(self):
        return '%s#%s' % (self.original().shorthand_id(), self.version)

    def url(self):
        return self.original().url() + '?version=%d' % self.version

    def index(self):
        result = Snapshot.index(self)
        result.update(
            title_s='Version %d of %s' % (
                self.version, self.original().shorthand_id()),
            type_s=self.type_s,
            text=self.data.text)
        return result

class MyArtifact(VersionedArtifact):
    class __mongometa__:
        name='my_artifact'
        history_class = MyArtifactHistory
    type_s = 'MyArtifact'

    text = FieldProperty(str, if_missing='')
        
    def url(self):
        return c.app.script_name + '/' + str(self._id) + '/'
    
    def shorthand_id(self):
        return '%s/%s' % (self.type_s, str(self._id))

    def index(self):
        result = VersionedArtifact.index(self)
        result.update(type_s=self.type_s, text=self.text)
        return result

    def root_comments(self):
        return MyArtifactComment.query.find(dict(artifact_id=self._id, parent_id=None))
    def reply(self):
        while True:
            try:
                c = MyArtifactComment(artifact_id=self._id)
                return c
            except OperationFailure:
                sleep(0.1)
                continue

class MyArtifactComment(Message):
    class __mongometa__:
        name='my_artifact_comment'
    type_s = 'MyArtifact Comment'

    artifact_id=FieldProperty(schema.ObjectId)

    def index(self):
        result = Message.index(self)
        author = self.author()
        result.update(
            title_s='Comment on %s by %s' % (
                self.artifact.shorthand_id(), author.display_name),
            type_s=self.type_s)
        return result

    @property
    def artifact(self):
        return MyArtifact.query.get(_id=self.artifact_id)

    @property
    def posted_ago(self):
        comment_td = (datetime.utcnow() - self.timestamp)
        if comment_td.seconds < 3600 and comment_td.days < 1:
            return "%s minutes ago" % (comment_td.seconds / 60)
        elif comment_td.seconds >= 3600 and comment_td.days < 1:
            return "%s hours ago" % (comment_td.seconds / 3600)
        elif comment_td.days >= 1 and comment_td.days < 7:
            return "%s days ago" % comment_td.days
        elif comment_td.days >= 7 and comment_td.days < 30:
            return "%s weeks ago" % (comment_td.days / 7)
        elif comment_td.days >= 30 and comment_td.days < 365:
            return "%s months ago" % (comment_td.days / 30)
        else:
            return "%s years ago" % (comment_td.days / 365)

    def url(self):
        return self.artifact.url() + '#comment-' + self._id
                          
    def shorthand_id(self):
        return '%s-%s' % (self.artifact.shorthand_id, self._id)
