# /opt/docker/dev/service_finder/backend/app/models/marketplace/service_request.py
"""
ServiceRequest - Piactér központi tranzakciós modellje.
Epic 7: Marketplace ServiceRequest dedikált modell.
"""

from typing import Optional, TYPE_CHECKING
from datetime import datetime
from sqlalchemy import String, ForeignKey, Text, DateTime, Numeric, Integer, Index
from sqlalchemy.orm import Mapped, mapped_column, relationship
from sqlalchemy.sql import func

from app.database import Base

if TYPE_CHECKING:
    from ..identity.identity import User
    from ..vehicle.asset import Asset
    from ..marketplace.service import Branch


class ServiceRequest(Base):
    """
    Szervizigény (ServiceRequest) tábla.
    Egy felhasználó által létrehozott szervizigényt reprezentál, amely lehetővé teszi
    a szervizszolgáltatók számára árajánlatok készítését és a tranzakciók lebonyolítását.
    """
    __tablename__ = "service_requests"
    __table_args__ = (
        Index('idx_service_request_status', 'status'),
        Index('idx_service_request_user_id', 'user_id'),
        Index('idx_service_request_asset_id', 'asset_id'),
        Index('idx_service_request_branch_id', 'branch_id'),
        {"schema": "marketplace"}
    )

    id: Mapped[int] = mapped_column(Integer, primary_key=True, index=True)
    
    # Idegen kulcsok (Kapcsolódási pontok)
    user_id: Mapped[int] = mapped_column(
        ForeignKey("identity.users.id", ondelete="CASCADE"),
        nullable=False,
        index=True,
        comment="A szervizigényt létrehozó felhasználó"
    )
    asset_id: Mapped[Optional[int]] = mapped_column(
        ForeignKey("vehicle.assets.id", ondelete="SET NULL"),
        nullable=True,
        comment="Érintett jármű (opcionális)"
    )
    branch_id: Mapped[Optional[int]] = mapped_column(
        ForeignKey("fleet.branches.id", ondelete="SET NULL"),
        nullable=True,
        comment="Célzott szerviz (ha van)"
    )
    
    # Üzleti logika mezők
    status: Mapped[str] = mapped_column(
        String(50),
        server_default="pending",
        index=True,
        comment="pending, quoted, accepted, scheduled, completed, cancelled"
    )
    description: Mapped[Optional[str]] = mapped_column(
        Text,
        nullable=True,
        comment="A szervizigény részletes leírása"
    )
    price_estimate: Mapped[Optional[float]] = mapped_column(
        Numeric(10, 2),
        nullable=True,
        comment="Becsült ár (opcionális)"
    )
    requested_date: Mapped[Optional[datetime]] = mapped_column(
        DateTime(timezone=True),
        nullable=True,
        comment="Kért szerviz dátum"
    )
    
    # Audit
    created_at: Mapped[datetime] = mapped_column(
        DateTime(timezone=True),
        server_default=func.now(),
        nullable=False,
        comment="Létrehozás időbélyege"
    )
    updated_at: Mapped[datetime] = mapped_column(
        DateTime(timezone=True),
        server_default=func.now(),
        onupdate=func.now(),
        nullable=False,
        comment="Utolsó módosítás időbélyege"
    )

    # Relationships (opcionális, de ajánlott a lazy loading miatt)
    user: Mapped["User"] = relationship("User", back_populates="service_requests", lazy="selectin")
    asset: Mapped[Optional["Asset"]] = relationship("Asset", back_populates="service_requests", lazy="selectin")
    branch: Mapped[Optional["Branch"]] = relationship("Branch", back_populates="service_requests", lazy="selectin")

    def __repr__(self) -> str:
        return f"<ServiceRequest(id={self.id}, status='{self.status}', user_id={self.user_id})>"