from sqlalchemy import Integer, SmallInteger, String
from sqlalchemy.dialects.postgresql import ARRAY
from sqlalchemy.orm import Mapped, mapped_column, relationship

from app.core.database import Base


class Pokemon(Base):
    __tablename__ = "pokemon"

    id: Mapped[int] = mapped_column(primary_key=True)
    pokeapi_id: Mapped[int] = mapped_column(Integer, unique=True)
    national_dex: Mapped[int] = mapped_column(SmallInteger)
    name: Mapped[str] = mapped_column(String(50))
    types: Mapped[list[str]] = mapped_column(ARRAY(String(20)))
    sprite_url: Mapped[str | None] = mapped_column(String(500))

    route_encounters: Mapped[list["RouteEncounter"]] = relationship(
        back_populates="pokemon"
    )
    encounters: Mapped[list["Encounter"]] = relationship(
        foreign_keys="[Encounter.pokemon_id]", back_populates="pokemon"
    )

    def __repr__(self) -> str:
        return f"<Pokemon(id={self.id}, name='{self.name}', pokeapi_id={self.pokeapi_id}, dex={self.national_dex})>"
