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

from sqlalchemy import Boolean, Column, Date, DateTime, Enum, String, Text
from sqlalchemy.dialects.postgresql import UUID

from app.database import Base


class ApplicationStatus(str, PyEnum):
    PENDING = "pending"
    APPROVED = "approved"
    REJECTED = "rejected"


class Application(Base):
    __tablename__ = "applications"

    id = Column(UUID(as_uuid=True), primary_key=True, default=uuid4, index=True)
    application_id = Column(String(20), unique=True, nullable=False, index=True)  # APP0001 format
    
    # Personal Information
    first_name = Column(String(100), nullable=False)
    last_name = Column(String(100), nullable=False)
    middle_name = Column(String(100), nullable=True)
    email = Column(String(255), nullable=False, index=True)
    phone = Column(String(20), nullable=False)
    date_of_birth = Column(Date, nullable=True)
    gender = Column(String(10), nullable=True)
    state_of_origin = Column(String(100), nullable=False)
    lga = Column(String(100), nullable=False)  # Local Government Area
    
    # NIN Verification
    nin = Column(String(11), nullable=True)
    nin_verified = Column(Boolean, default=False, nullable=False)
    
    # WAEC/NECO Results
    waec_number = Column(String(50), nullable=True)
    waec_year = Column(String(4), nullable=True)
    waec_verified = Column(Boolean, default=False, nullable=False)
    waec_verification_pending = Column(Boolean, default=False, nullable=False)  # New field
    
    # JAMB Information (optional for open university)
    jamb_reg_number = Column(String(50), nullable=True)
    jamb_score = Column(String(10), nullable=True)
    jamb_year = Column(String(4), nullable=True)
    
    # Programme Selection
    programme = Column(String(255), nullable=False)
    
    # Additional Information
    current_occupation = Column(String(255), nullable=True)
    employer = Column(String(255), nullable=True)
    address = Column(Text, nullable=True)
    parent_guardian_name = Column(String(255), nullable=True)
    parent_guardian_phone = Column(String(20), nullable=True)
    
    # Application Status
    status = Column(Enum(ApplicationStatus), default=ApplicationStatus.PENDING, nullable=False, index=True)
    rejection_note = Column(Text, nullable=True)
    rejection_date = Column(DateTime, nullable=True)
    matric_number = Column(String(50), nullable=True, unique=True, index=True)
    admission_date = Column(DateTime, nullable=True)
    
    # Timestamps
    date_applied = Column(DateTime, default=datetime.utcnow, nullable=False)
    submitted_at = Column(DateTime, default=datetime.utcnow, nullable=False)
    updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False)

    def __repr__(self):
        return f"<Application {self.application_id}: {self.first_name} {self.last_name}>"
