import datetime
from sqlalchemy import String, Text, Boolean, DateTime, ForeignKey, Integer
from sqlalchemy.orm import Mapped, mapped_column, relationship
from app.database import Base


class User(Base):
    __tablename__ = "users"

    id: Mapped[int] = mapped_column(primary_key=True, index=True)
    email: Mapped[str] = mapped_column(String(255), unique=True, index=True)
    username: Mapped[str] = mapped_column(String(100), unique=True, index=True)
    full_name: Mapped[str] = mapped_column(String(200))
    hashed_password: Mapped[str] = mapped_column(String(255))
    bio: Mapped[str | None] = mapped_column(Text, nullable=True)
    avatar_url: Mapped[str | None] = mapped_column(String(500), nullable=True)
    is_verified: Mapped[bool] = mapped_column(Boolean, default=False)
    is_active: Mapped[bool] = mapped_column(Boolean, default=True)
    is_admin: Mapped[bool] = mapped_column(Boolean, default=False)
    field_id: Mapped[int | None] = mapped_column(ForeignKey("fields.id"), nullable=True)
    created_at: Mapped[datetime.datetime] = mapped_column(DateTime, default=datetime.datetime.utcnow)
    updated_at: Mapped[datetime.datetime] = mapped_column(DateTime, default=datetime.datetime.utcnow, onupdate=datetime.datetime.utcnow)

    field = relationship("Field", back_populates="users")
    affiliations = relationship("UserAffiliation", back_populates="user", cascade="all, delete-orphan")
    publications = relationship("Publication", back_populates="author")
    questions = relationship("Question", back_populates="author")
    answers = relationship("Answer", back_populates="author")
    jobs_posted = relationship("Job", back_populates="posted_by")
    notifications = relationship("Notification", back_populates="user", foreign_keys="Notification.user_id")

    @property
    def primary_affiliation(self):
        for a in self.affiliations:
            if a.is_primary:
                return a
        return self.affiliations[0] if self.affiliations else None


class UserAffiliation(Base):
    __tablename__ = "user_affiliations"

    id: Mapped[int] = mapped_column(primary_key=True, index=True)
    user_id: Mapped[int] = mapped_column(ForeignKey("users.id", ondelete="CASCADE"), index=True)
    designation: Mapped[str] = mapped_column(String(200))
    institution: Mapped[str] = mapped_column(String(300))
    department: Mapped[str | None] = mapped_column(String(300), nullable=True)
    is_primary: Mapped[bool] = mapped_column(Boolean, default=False)
    start_year: Mapped[int | None] = mapped_column(Integer, nullable=True)
    end_year: Mapped[int | None] = mapped_column(Integer, nullable=True)

    user = relationship("User", back_populates="affiliations")
