import enum

from sqlalchemy.orm.properties import ForeignKey

import spec
from sqlalchemy.orm import Mapped, mapped_column, relationship
from sqlalchemy.schema import ForeignKeyConstraint, UniqueConstraint
from sqlalchemy.types import BigInteger, Boolean, Enum, Integer
import app_db


class PlayerTeamRole(app_db.BaseModel):
    __tablename__ = "players_teams_roles"

    class Role(enum.Enum):
        Unknown = 0

        Scout = 1
        PocketScout = 2
        FlankScout = 3

        Soldier = 4
        PocketSoldier = 5
        Roamer = 6

        Pyro = 7
        Demoman = 8
        HeavyWeapons = 9
        Engineer = 10
        Medic = 11
        Sniper = 12
        Spy = 13

    # surrogate key
    id: Mapped[int] = mapped_column(
        Integer,
        autoincrement=True,
        primary_key=True,
    )

    # primary key
    player_team_id = mapped_column(ForeignKey("players_teams.id"), nullable=False)
    role: Mapped[Role] = mapped_column(Enum(Role), nullable=False)

    player_team: Mapped["PlayerTeam"] = relationship(
        "PlayerTeam",
        back_populates="player_roles"
    )

    is_main: Mapped[bool] = mapped_column(Boolean)

    __table_args__ = (
        UniqueConstraint("player_team_id", "role"),
    )

class RoleSchema(spec.BaseModel):
    role: str
    is_main: bool

    @classmethod
    def from_model(cls, role: PlayerTeamRole):
        return cls(role=role.role.name, is_main=role.is_main)

class PlayerRoleSchema(spec.BaseModel):
    player: "PlayerSchema"
    role: RoleSchema


from models.player_team import PlayerTeam
from models.player import PlayerSchema