"""Mentorship models for mentor-student relationships."""

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

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

from app.database import Base


class MentorStatus(str, PyEnum):
    """Mentor status."""
    PENDING = "pending"
    APPROVED = "approved"
    ACTIVE = "active"
    INACTIVE = "inactive"
    REJECTED = "rejected"


class SectorType(str, PyEnum):
    """Mentor sector/industry."""
    FINANCE = "finance"
    TECHNOLOGY = "technology"
    CREATIVE_MEDIA = "creative_media"
    OTHER = "other"


class MentorshipSessionStatus(str, PyEnum):
    """Mentorship session status."""
    SCHEDULED = "scheduled"
    COMPLETED = "completed"
    CANCELLED = "cancelled"
    NO_SHOW = "no_show"


class Mentor(Base):
    """Mentor profile."""
    __tablename__ = "mentors"

    id = Column(UUID(as_uuid=True), primary_key=True, default=uuid4, index=True)
    user_id = Column(UUID(as_uuid=True), ForeignKey("users.id"), nullable=True, unique=True, index=True)  # Optional - mentors may not have user accounts
    
    # Personal information
    full_name = Column(String(255), nullable=False)
    email = Column(String(255), nullable=False, unique=True, index=True)
    phone = Column(String(20), nullable=True)
    gender = Column(String(10), nullable=True)
    
    # Professional information
    sector = Column(Enum(SectorType), nullable=False, index=True)
    years_experience = Column(Integer, nullable=True)
    expertise = Column(String(255), nullable=True)
    company = Column(String(255), nullable=True)
    job_title = Column(String(255), nullable=True)
    
    # Application/Status
    status = Column(Enum(MentorStatus), default=MentorStatus.PENDING, nullable=False, index=True)
    applied_date = Column(DateTime, default=datetime.utcnow, nullable=False)
    approved_date = Column(DateTime, nullable=True)
    approved_by = Column(UUID(as_uuid=True), ForeignKey("users.id"), nullable=True)
    
    # Additional metadata
    bio = Column(Text, nullable=True)
    extra_data = Column(JSON, nullable=True)
    
    created_at = Column(DateTime, default=datetime.utcnow, nullable=False)
    updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False)
    
    # Relationships
    user = relationship("User", foreign_keys=[user_id])
    approver = relationship("User", foreign_keys=[approved_by])
    mentee_assignments = relationship("MentorMentee", back_populates="mentor", cascade="all, delete-orphan")
    sessions = relationship("MentorshipSession", back_populates="mentor", cascade="all, delete-orphan")

    def __repr__(self):
        return f"<Mentor {self.full_name} - {self.sector.value}>"


class MentorMentee(Base):
    """Mentor-student assignment."""
    __tablename__ = "mentor_mentees"

    id = Column(UUID(as_uuid=True), primary_key=True, default=uuid4, index=True)
    mentor_id = Column(UUID(as_uuid=True), ForeignKey("mentors.id"), nullable=False, index=True)
    student_id = Column(UUID(as_uuid=True), ForeignKey("users.id"), nullable=False, index=True)
    
    assigned_date = Column(DateTime, default=datetime.utcnow, nullable=False)
    assigned_by = Column(UUID(as_uuid=True), ForeignKey("users.id"), nullable=True)
    notes = Column(Text, nullable=True)
    
    is_active = Column(Boolean, default=True, nullable=False, index=True)
    ended_date = Column(DateTime, nullable=True)
    end_reason = Column(Text, nullable=True)
    
    created_at = Column(DateTime, default=datetime.utcnow, nullable=False)
    updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False)
    
    # Relationships
    mentor = relationship("Mentor", back_populates="mentee_assignments")
    student = relationship("User", foreign_keys=[student_id])
    assigner = relationship("User", foreign_keys=[assigned_by])
    sessions = relationship("MentorshipSession", back_populates="assignment")

    def __repr__(self):
        return f"<MentorMentee {self.mentor_id} -> {self.student_id}>"


class MentorshipSession(Base):
    """Mentorship session log."""
    __tablename__ = "mentorship_sessions"

    id = Column(UUID(as_uuid=True), primary_key=True, default=uuid4, index=True)
    assignment_id = Column(UUID(as_uuid=True), ForeignKey("mentor_mentees.id"), nullable=False, index=True)
    mentor_id = Column(UUID(as_uuid=True), ForeignKey("mentors.id"), nullable=False, index=True)
    
    session_date = Column(DateTime, nullable=False, index=True)
    duration_minutes = Column(Integer, nullable=True)
    status = Column(Enum(MentorshipSessionStatus), default=MentorshipSessionStatus.SCHEDULED, nullable=False, index=True)
    
    # Session details
    topic = Column(String(255), nullable=True)
    notes = Column(Text, nullable=True)
    student_feedback = Column(Text, nullable=True)
    mentor_feedback = Column(Text, nullable=True)
    
    created_at = Column(DateTime, default=datetime.utcnow, nullable=False)
    updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False)
    
    # Relationships
    assignment = relationship("MentorMentee", back_populates="sessions")
    mentor = relationship("Mentor", back_populates="sessions")

    def __repr__(self):
        return f"<MentorshipSession {self.mentor_id} on {self.session_date}>"
