from sqlalchemy import ForeignKey, SmallInteger, String, UniqueConstraint
from sqlalchemy.orm import Mapped, mapped_column, relationship

from app.core.database import Base


class RouteEncounter(Base):
    __tablename__ = "route_encounters"
    __table_args__ = (
        UniqueConstraint(
            "route_id", "pokemon_id", "encounter_method", "game_id",
            name="uq_route_pokemon_method_game"
        ),
    )

    id: Mapped[int] = mapped_column(primary_key=True)
    route_id: Mapped[int] = mapped_column(ForeignKey("routes.id"), index=True)
    pokemon_id: Mapped[int] = mapped_column(ForeignKey("pokemon.id"), index=True)
    game_id: Mapped[int] = mapped_column(ForeignKey("games.id"), index=True)
    encounter_method: Mapped[str] = mapped_column(String(30))
    encounter_rate: Mapped[int] = mapped_column(SmallInteger)
    min_level: Mapped[int] = mapped_column(SmallInteger)
    max_level: Mapped[int] = mapped_column(SmallInteger)

    route: Mapped["Route"] = relationship(back_populates="route_encounters")
    pokemon: Mapped["Pokemon"] = relationship(back_populates="route_encounters")
    game: Mapped["Game"] = relationship()

    def __repr__(self) -> str:
        return f"<RouteEncounter(route_id={self.route_id}, pokemon_id={self.pokemon_id}, method='{self.encounter_method}')>"
