"""Partner models for corporate and educational partners."""

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

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

from app.database import Base


class PartnerType(str, PyEnum):
    """Partner type."""
    CORPORATE = "corporate"
    EDUCATIONAL = "educational"


class OpportunityType(str, PyEnum):
    """Job/internship opportunity type."""
    FULL_TIME = "full_time"
    PART_TIME = "part_time"
    INTERNSHIP = "internship"
    CONTRACT = "contract"


class CorporatePartner(Base):
    """Corporate partner account."""
    __tablename__ = "corporate_partners"

    id = Column(UUID(as_uuid=True), primary_key=True, default=uuid4, index=True)
    user_id = Column(UUID(as_uuid=True), ForeignKey("users.id"), nullable=False, unique=True, index=True)
    
    company_name = Column(String(255), nullable=False)
    industry = Column(String(100), nullable=True)
    company_size = Column(String(50), nullable=True)  # e.g., "50-200", "200-1000"
    website = Column(String(255), nullable=True)
    contact_person = Column(String(255), nullable=True)
    contact_email = Column(String(255), nullable=True)
    contact_phone = Column(String(20), nullable=True)
    
    # Partnership details
    partnership_start_date = Column(DateTime, nullable=True)
    is_active = Column(Boolean, default=True, nullable=False, index=True)
    
    # Additional metadata
    extra_data = Column(JSON, nullable=True)  # For flexible additional data
    
    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])
    opportunities = relationship("PartnerOpportunity", back_populates="partner", cascade="all, delete-orphan")
    enrolled_students = relationship("PartnerEnrollment", back_populates="corporate_partner", cascade="all, delete-orphan")
    discovery_sessions = relationship("DiscoverySession", foreign_keys="DiscoverySession.corporate_partner_id", cascade="all, delete-orphan")

    def __repr__(self):
        return f"<CorporatePartner {self.company_name}>"


class PartnerOpportunity(Base):
    """Job/internship opportunity posted by corporate partner."""
    __tablename__ = "partner_opportunities"

    id = Column(UUID(as_uuid=True), primary_key=True, default=uuid4, index=True)
    partner_id = Column(UUID(as_uuid=True), ForeignKey("corporate_partners.id"), nullable=False, index=True)
    
    title = Column(String(255), nullable=False)
    description = Column(Text, nullable=False)
    opportunity_type = Column(Enum(OpportunityType), nullable=False, index=True)
    department = Column(String(100), nullable=True)  # Preferred department
    requirements = Column(Text, nullable=True)
    location = Column(String(255), nullable=True)
    salary_range = Column(String(100), nullable=True)
    
    is_active = Column(Boolean, default=True, nullable=False, index=True)
    application_deadline = 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
    partner = relationship("CorporatePartner", back_populates="opportunities")
    applications = relationship("OpportunityApplication", back_populates="opportunity", cascade="all, delete-orphan")

    def __repr__(self):
        return f"<PartnerOpportunity {self.title} - {self.partner_id}>"


class OpportunityApplication(Base):
    """Student application to a partner opportunity."""
    __tablename__ = "opportunity_applications"

    id = Column(UUID(as_uuid=True), primary_key=True, default=uuid4, index=True)
    opportunity_id = Column(UUID(as_uuid=True), ForeignKey("partner_opportunities.id"), nullable=False, index=True)
    student_id = Column(UUID(as_uuid=True), ForeignKey("users.id"), nullable=False, index=True)
    
    cover_letter = Column(Text, nullable=True)
    status = Column(String(50), default="pending", nullable=False, index=True)  # pending, shortlisted, rejected, accepted
    
    applied_at = Column(DateTime, default=datetime.utcnow, nullable=False)
    reviewed_at = Column(DateTime, nullable=True)
    
    # Relationships
    opportunity = relationship("PartnerOpportunity", back_populates="applications")
    student = relationship("User", foreign_keys=[student_id])

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


class PartnerEnrollment(Base):
    """Student enrollment through corporate partner sponsorship."""
    __tablename__ = "partner_enrollments"

    id = Column(UUID(as_uuid=True), primary_key=True, default=uuid4, index=True)
    corporate_partner_id = Column(UUID(as_uuid=True), ForeignKey("corporate_partners.id"), nullable=False, index=True)
    student_id = Column(UUID(as_uuid=True), ForeignKey("users.id"), nullable=False, index=True)
    
    enrollment_date = Column(DateTime, default=datetime.utcnow, nullable=False)
    sponsorship_type = Column(String(50), nullable=True)  # full, partial, scholarship
    notes = Column(Text, nullable=True)
    
    created_at = Column(DateTime, default=datetime.utcnow, nullable=False)
    
    # Relationships
    corporate_partner = relationship("CorporatePartner", back_populates="enrolled_students")
    student = relationship("User", foreign_keys=[student_id])

    def __repr__(self):
        return f"<PartnerEnrollment {self.student_id} via {self.corporate_partner_id}>"


class EducationalPartner(Base):
    """Educational partner account."""
    __tablename__ = "educational_partners"

    id = Column(UUID(as_uuid=True), primary_key=True, default=uuid4, index=True)
    user_id = Column(UUID(as_uuid=True), ForeignKey("users.id"), nullable=False, unique=True, index=True)
    
    institution_name = Column(String(255), nullable=False)
    institution_type = Column(String(100), nullable=True)  # university, polytechnic, college, etc.
    country = Column(String(100), nullable=True)
    website = Column(String(255), nullable=True)
    contact_person = Column(String(255), nullable=True)
    contact_email = Column(String(255), nullable=True)
    contact_phone = Column(String(20), nullable=True)
    
    # Partnership details
    partnership_start_date = Column(DateTime, nullable=True)
    revenue_share_percentage = Column(Numeric(5, 2), nullable=True)  # e.g., 15.00 for 15%
    is_active = Column(Boolean, default=True, nullable=False, index=True)
    
    # Additional metadata
    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])
    cohorts = relationship("PartnerCohort", back_populates="educational_partner", cascade="all, delete-orphan")
    discovery_sessions = relationship("DiscoverySession", foreign_keys="DiscoverySession.educational_partner_id", cascade="all, delete-orphan")

    def __repr__(self):
        return f"<EducationalPartner {self.institution_name}>"


class PartnerCohort(Base):
    """Cohort of students enrolled through educational partner."""
    __tablename__ = "partner_cohorts"

    id = Column(UUID(as_uuid=True), primary_key=True, default=uuid4, index=True)
    educational_partner_id = Column(UUID(as_uuid=True), ForeignKey("educational_partners.id"), nullable=False, index=True)
    programme_id = Column(UUID(as_uuid=True), ForeignKey("programmes.id"), nullable=False, index=True)
    academic_session_id = Column(UUID(as_uuid=True), ForeignKey("academic_sessions.id"), nullable=True, index=True)
    
    cohort_name = Column(String(255), nullable=False)
    start_date = Column(DateTime, nullable=False)
    end_date = Column(DateTime, nullable=True)
    total_enrollments = Column(Integer, default=0, nullable=False)
    revenue_generated = Column(Numeric(10, 2), default=0.00, nullable=False)
    
    created_at = Column(DateTime, default=datetime.utcnow, nullable=False)
    updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False)
    
    # Relationships
    educational_partner = relationship("EducationalPartner", back_populates="cohorts")
    programme = relationship("Programme")
    academic_session = relationship("AcademicSession")

    def __repr__(self):
        return f"<PartnerCohort {self.cohort_name} - {self.educational_partner_id}>"


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


class DiscoverySession(Base):
    """Discovery session booking for partners (72-hour mandate)."""
    __tablename__ = "discovery_sessions"

    id = Column(UUID(as_uuid=True), primary_key=True, default=uuid4, index=True)
    
    # Partner reference - can be either corporate or educational partner
    partner_type = Column(Enum(PartnerType), nullable=False, index=True)
    corporate_partner_id = Column(UUID(as_uuid=True), ForeignKey("corporate_partners.id"), nullable=True, index=True)
    educational_partner_id = Column(UUID(as_uuid=True), ForeignKey("educational_partners.id"), nullable=True, index=True)
    user_id = Column(UUID(as_uuid=True), ForeignKey("users.id"), nullable=False, index=True)  # For quick lookup
    
    # Session details
    scheduled_date = Column(DateTime, nullable=False, index=True)  # Date and time combined
    scheduled_time = Column(String(20), nullable=False)  # e.g., "09:00 AM", "10:30 AM"
    status = Column(Enum(DiscoverySessionStatus), default=DiscoverySessionStatus.SCHEDULED, nullable=False, index=True)
    
    # Google Calendar integration (optional)
    google_calendar_event_id = Column(String(255), nullable=True)
    google_calendar_link = Column(String(500), nullable=True)
    
    # Additional metadata
    notes = 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
    corporate_partner = relationship("CorporatePartner", foreign_keys=[corporate_partner_id])
    educational_partner = relationship("EducationalPartner", foreign_keys=[educational_partner_id])
    user = relationship("User", foreign_keys=[user_id])

    def __repr__(self):
        return f"<DiscoverySession {self.partner_type.value} on {self.scheduled_date}>"
