from src import db
from sqlalchemy.orm import mapped_column, Mapped, relationship
from sqlalchemy import Integer, String, Boolean, ForeignKey, Text
from werkzeug.security import generate_password_hash, check_password_hash
from datetime import datetime, timezone

class StudentTable(db.Model):
    __tablename__ = "students"

    id: Mapped[int] = mapped_column(Integer(), primary_key=True, autoincrement=True)
    username: Mapped[str] = mapped_column(String(30), nullable=False, unique=True)
    password: Mapped[str] = mapped_column(String(255), nullable=False)
    grade: Mapped[str] = mapped_column(String(10), nullable=False)
    section: Mapped[str] = mapped_column(String(5), nullable=False)
    avatar: Mapped[str] = mapped_column(String(20), nullable=False, default="👨‍🎓")
    coins: Mapped[int] = mapped_column(Integer(), nullable=False, default=500)
    gems: Mapped[int] = mapped_column(Integer(), nullable=False, default=40)
    streak: Mapped[int] = mapped_column(Integer(), nullable=False, default=1)
    firstname: Mapped[str] = mapped_column(String(195), nullable=False)
    lastname: Mapped[str] = mapped_column(String(255), nullable=True)
    roll_no: Mapped[int] = mapped_column(Integer(), nullable=False)
    created_at: Mapped[datetime] = mapped_column(default=lambda: datetime.now(timezone.utc))
    last_login: Mapped[datetime] = mapped_column(default=lambda: datetime.now(timezone.utc))
    isLoggedIn: Mapped[str] = mapped_column(Boolean(), default=False, nullable=False)
    purchase_avatar: Mapped[str] = mapped_column(Text(), nullable=True, default="[]")
    school_id: Mapped[int] = mapped_column(ForeignKey("schools.id"), nullable=False)
    school = relationship("SchoolTable", back_populates="students")
    overall_ranking: Mapped[int] = mapped_column(Integer(), nullable=False)
    speed_ranking: Mapped[int] = mapped_column(Integer(), nullable=False)
    accuracy_ranking: Mapped[int] = mapped_column(Integer(), nullable=False)

    def set_password(self, password):
        self.password = generate_password_hash(password)
    
    def check_password(self, password):
        return check_password_hash(self.password, password)