from datetime import datetime
from enum import Enum as PyEnum
from uuid import uuid4

from sqlalchemy import Boolean, Column, DateTime, Enum, ForeignKey, String
from sqlalchemy.dialects.postgresql import UUID
from sqlalchemy.orm import relationship

from app.database import Base


class UserType(str, PyEnum):
    """User type enumeration for all platform user types."""
    GLOBAL_UNDERGRADUATE = "global_undergraduate"
    ACADEMIC_FACULTY = "academic_faculty"
    REGISTRAR_OPERATIONS = "registrar_operations"
    BURSARY_CONTROL = "bursary_control"
    STUDENT_DEANERY = "student_deanery"
    HEAD_OF_DEPARTMENT = "head_of_department"
    ADMISSIONS_HUB = "admissions_hub"
    CORPORATE_PARTNER = "corporate_partner"
    MENTORSHIP_LEAD = "mentorship_lead"
    SENATE_ADMIN = "senate_admin"
    EDUCATIONAL_PARTNER = "educational_partner"


class User(Base):
    """User model for all platform user types."""
    __tablename__ = "users"

    id = Column(UUID(as_uuid=True), primary_key=True, default=uuid4, index=True)
    email = Column(String(255), unique=True, nullable=False, index=True)
    password_hash = Column(String(255), nullable=False)
    user_type = Column(Enum(UserType), nullable=False, index=True)
    
    # Student-specific fields
    matric_number = Column(String(50), unique=True, nullable=True, index=True)
    application_id = Column(String(20), ForeignKey('applications.application_id'), nullable=True)
    
    # Common fields
    is_active = Column(Boolean, default=True, nullable=False)
    last_login = Column(DateTime, nullable=True)
    created_at = Column(DateTime, default=datetime.utcnow, nullable=False)
    updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False)
    
    # Relationships
    application = relationship("Application", foreign_keys=[application_id], backref="user_accounts")

    def __repr__(self):
        return f"<User {self.email}: {self.user_type.value}>"
