"""User reputation model (Trust System — Phase 3).

A :class:`UserReputation` is a **cached** rollup of a user's trust signals —
average rating, review count, positive-review percentage and completed
sales/purchases. It exists so pages never run ``AVG()``/``COUNT()`` over the
reviews/transactions tables on every request: rendering reads these columns
directly, and the values are refreshed only when a review or a completed
transaction is created (see :mod:`app.reviews.reputation`).

There is exactly one row per user (unique ``user_id``), created on demand. The
model is intentionally a plain value cache so future badge logic (Trusted Seller,
Top Seller, Quick Responder, Popular Seller) can simply read these fields.
"""

from __future__ import annotations

from app.extensions import db
from app.models.base import BaseModel, BigIntegerType
from app.models.mixins import TimestampMixin


class UserReputation(BaseModel, TimestampMixin):
    """Cached trust rollup for a single user."""

    __tablename__ = "user_reputations"
    __table_args__ = (
        db.UniqueConstraint("user_id", name="uq_user_reputations_user_id"),
    )

    user_id = db.Column(BigIntegerType, db.ForeignKey("users.id"), nullable=False, index=True)
    average_rating = db.Column(db.Numeric(3, 2), nullable=False, default=0, server_default="0")
    review_count = db.Column(db.Integer, nullable=False, default=0, server_default="0")
    completed_sales = db.Column(db.Integer, nullable=False, default=0, server_default="0")
    completed_purchases = db.Column(db.Integer, nullable=False, default=0, server_default="0")
    positive_review_percentage = db.Column(db.Numeric(5, 2), nullable=False, default=0, server_default="0")
    # Reserved for the future "Quick Responder" badge; not populated in Phase 3.
    average_response_minutes = db.Column(db.Integer, nullable=True)

    user = db.relationship("User", backref=db.backref("reputation", uselist=False))

    @property
    def has_reviews(self) -> bool:
        return self.review_count > 0

    @property
    def rating(self) -> float:
        """Average rating as a float (0.0 when there are no reviews)."""
        return float(self.average_rating or 0)

    def __repr__(self) -> str:
        return f"<UserReputation user_id={self.user_id} rating={self.rating} reviews={self.review_count}>"
