from sqlalchemy import Column, Integer, Unicode, DateTime
from sqlalchemy.orm import relationship
from sqlalchemy.sql.expression import func
from szurubooru.db.base import Base
from szurubooru.db.post import Post, PostScore, PostFavorite
from szurubooru.db.comment import Comment


class User(Base):
    __tablename__ = 'user'

    AVATAR_GRAVATAR = 'gravatar'
    AVATAR_MANUAL = 'manual'

    RANK_ANONYMOUS = 'anonymous'
    RANK_RESTRICTED = 'restricted'
    RANK_REGULAR = 'regular'
    RANK_POWER = 'power'
    RANK_MODERATOR = 'moderator'
    RANK_ADMINISTRATOR = 'administrator'
    RANK_NOBODY = 'nobody'  # unattainable, used for privileges

    user_id = Column('id', Integer, primary_key=True)
    creation_time = Column('creation_time', DateTime, nullable=False)
    last_login_time = Column('last_login_time', DateTime)
    version = Column('version', Integer, default=1, nullable=False)
    name = Column('name', Unicode(50), nullable=False, unique=True)
    password_hash = Column('password_hash', Unicode(64), nullable=False)
    password_salt = Column('password_salt', Unicode(32))
    email = Column('email', Unicode(64), nullable=True)
    rank = Column('rank', Unicode(32), nullable=False)
    avatar_style = Column(
        'avatar_style', Unicode(32), nullable=False, default=AVATAR_GRAVATAR)

    comments = relationship('Comment')

    @property
    def post_count(self):
        from szurubooru.db import session
        return (session
            .query(func.sum(1))
            .filter(Post.user_id == self.user_id)
            .one()[0] or 0)

    @property
    def comment_count(self):
        from szurubooru.db import session
        return (session
            .query(func.sum(1))
            .filter(Comment.user_id == self.user_id)
            .one()[0] or 0)

    @property
    def favorite_post_count(self):
        from szurubooru.db import session
        return (session
            .query(func.sum(1))
            .filter(PostFavorite.user_id == self.user_id)
            .one()[0] or 0)

    @property
    def liked_post_count(self):
        from szurubooru.db import session
        return (session
            .query(func.sum(1))
            .filter(PostScore.user_id == self.user_id)
            .filter(PostScore.score == 1)
            .one()[0] or 0)

    @property
    def disliked_post_count(self):
        from szurubooru.db import session
        return (session
            .query(func.sum(1))
            .filter(PostScore.user_id == self.user_id)
            .filter(PostScore.score == -1)
            .one()[0] or 0)

    __mapper_args__ = {
        'version_id_col': version,
        'version_id_generator': False,
    }