"""
Rating Model
Passenger and driver rating system
"""
from typing import Optional
from sqlalchemy import String, Integer, Float, Text, ForeignKey, Index, Boolean
from sqlalchemy.orm import Mapped, mapped_column, relationship

from app.models.base import BaseModel


class Rating(BaseModel):
    """
    Rating and review for completed rides.
    Supports bidirectional ratings (passenger rates driver and vice versa).
    """
    __tablename__ = "ratings"
    
    ride_id: Mapped[int] = mapped_column(
        ForeignKey("rides.id", ondelete="CASCADE"),
        unique=True,  # One rating per ride
        nullable=False,
        index=True
    )
    
    # Passenger rating for driver
    driver_rating: Mapped[Optional[float]] = mapped_column(Float, nullable=True)  # 1-5 stars
    driver_review: Mapped[Optional[str]] = mapped_column(Text, nullable=True)
    driver_rating_tags: Mapped[Optional[str]] = mapped_column(String(500), nullable=True)  # CSV tags
    
    # Driver rating for passenger
    passenger_rating: Mapped[Optional[float]] = mapped_column(Float, nullable=True)  # 1-5 stars
    passenger_review: Mapped[Optional[str]] = mapped_column(Text, nullable=True)
    passenger_rating_tags: Mapped[Optional[str]] = mapped_column(String(500), nullable=True)
    
    # Tip (optional, in cents)
    tip_amount: Mapped[int] = mapped_column(Integer, default=0, nullable=False)
    
    # Visibility
    is_driver_review_visible: Mapped[bool] = mapped_column(Boolean, default=True, nullable=False)
    is_passenger_review_visible: Mapped[bool] = mapped_column(Boolean, default=True, nullable=False)
    
    # Flagging
    is_flagged: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False)
    flag_reason: Mapped[Optional[str]] = mapped_column(Text, nullable=True)
    
    # Relationships
    ride: Mapped["Ride"] = relationship(
        "Ride",
        back_populates="rating"
    )
    
    # Indexes
    __table_args__ = (
        Index('idx_rating_ride', 'ride_id'),
    )


# Predefined rating tags
DRIVER_RATING_TAGS = [
    "professional",
    "clean_vehicle",
    "safe_driving",
    "good_navigation",
    "friendly",
    "on_time",
    "poor_driving",
    "rude",
    "vehicle_issues",
    "got_lost",
]

PASSENGER_RATING_TAGS = [
    "polite",
    "on_time",
    "respectful",
    "good_communication",
    "no_show",
    "rude",
    "mess_in_vehicle",
    "late_arrival",
]


# Import for type hints
from typing import TYPE_CHECKING
if TYPE_CHECKING:
    from app.models.ride import Ride
