import sqlalchemy as sa

from szurubooru.db import get_session
from szurubooru.model.base import Base


class CommentScore(Base):
    __tablename__ = "comment_score"

    comment_id = sa.Column(
        "comment_id",
        sa.Integer,
        sa.ForeignKey("comment.id"),
        nullable=False,
        primary_key=True,
    )
    user_id = sa.Column(
        "user_id",
        sa.Integer,
        sa.ForeignKey("user.id"),
        nullable=False,
        primary_key=True,
        index=True,
    )
    time = sa.Column("time", sa.DateTime, nullable=False)
    score = sa.Column("score", sa.Integer, nullable=False)

    comment = sa.orm.relationship("Comment")
    user = sa.orm.relationship(
        "User",
        backref=sa.orm.backref("comment_scores", cascade="all, delete-orphan"),
    )


class Comment(Base):
    __tablename__ = "comment"

    comment_id = sa.Column("id", sa.Integer, primary_key=True)
    post_id = sa.Column(
        "post_id",
        sa.Integer,
        sa.ForeignKey("post.id"),
        nullable=False,
        index=True,
    )
    user_id = sa.Column(
        "user_id",
        sa.Integer,
        sa.ForeignKey("user.id"),
        nullable=True,
        index=True,
    )
    version = sa.Column("version", sa.Integer, default=1, nullable=False)
    creation_time = sa.Column("creation_time", sa.DateTime, nullable=False)
    last_edit_time = sa.Column("last_edit_time", sa.DateTime)
    text = sa.Column("text", sa.UnicodeText, default=None)

    user = sa.orm.relationship("User")
    post = sa.orm.relationship("Post")
    scores = sa.orm.relationship(
        "CommentScore", cascade="all, delete-orphan", lazy="joined"
    )

    @property
    def score(self) -> int:
        return (
            get_session()
            .query(sa.sql.expression.func.sum(CommentScore.score))
            .filter(CommentScore.comment_id == self.comment_id)
            .one()[0]
            or 0
        )

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