"""Pydantic schemas for academic models."""

from datetime import date, datetime
from typing import Optional
from uuid import UUID

from pydantic import BaseModel

from app.models.academic import (
    AssessmentType, AttendanceStatus, EnrollmentStatus
)


# Programme Schemas
class ProgrammeBase(BaseModel):
    code: str
    name: str
    department: str
    faculty: Optional[str] = None
    duration_years: int = 4
    is_active: bool = True


class ProgrammeCreate(ProgrammeBase):
    pass


class ProgrammeResponse(ProgrammeBase):
    id: UUID
    created_at: datetime
    updated_at: datetime

    class Config:
        from_attributes = True


# Course Schemas
class CourseBase(BaseModel):
    programme_id: UUID
    code: str
    title: str
    description: Optional[str] = None
    level: int
    semester: int
    credit_units: int = 3
    is_elective: bool = False
    is_active: bool = True


class CourseCreate(CourseBase):
    pass


class CourseResponse(CourseBase):
    id: UUID
    created_at: datetime
    updated_at: datetime
    programme: Optional[ProgrammeResponse] = None

    class Config:
        from_attributes = True


# Enrollment Schemas
class EnrollmentBase(BaseModel):
    student_id: UUID
    programme_id: UUID
    course_id: UUID
    academic_session_id: Optional[UUID] = None
    status: EnrollmentStatus = EnrollmentStatus.ACTIVE


class EnrollmentCreate(EnrollmentBase):
    pass


class EnrollmentResponse(EnrollmentBase):
    id: UUID
    enrollment_date: datetime
    ca_score: Optional[float] = None
    exam_score: Optional[float] = None
    total_score: Optional[float] = None
    grade: Optional[str] = None
    grade_point: Optional[float] = None
    created_at: datetime
    updated_at: datetime
    course: Optional[CourseResponse] = None

    class Config:
        from_attributes = True


# Academic Session Schemas
class AcademicSessionBase(BaseModel):
    name: str
    start_date: date
    end_date: date
    is_current: bool = False


class AcademicSessionCreate(AcademicSessionBase):
    pass


class AcademicSessionResponse(AcademicSessionBase):
    id: UUID
    created_at: datetime
    updated_at: datetime

    class Config:
        from_attributes = True


# Attendance Schemas
class AttendanceSessionBase(BaseModel):
    course_id: UUID
    academic_session_id: Optional[UUID] = None
    lecturer_id: UUID
    session_date: date
    session_time: Optional[str] = None
    topic: Optional[str] = None
    notes: Optional[str] = None


class AttendanceSessionCreate(AttendanceSessionBase):
    pass


class AttendanceSessionResponse(AttendanceSessionBase):
    id: UUID
    created_at: datetime
    updated_at: datetime

    class Config:
        from_attributes = True


class AttendanceRecordBase(BaseModel):
    enrollment_id: UUID
    session_id: UUID
    status: AttendanceStatus = AttendanceStatus.ABSENT
    remarks: Optional[str] = None


class AttendanceRecordCreate(AttendanceRecordBase):
    pass


class AttendanceRecordResponse(AttendanceRecordBase):
    id: UUID
    recorded_at: datetime
    created_at: datetime

    class Config:
        from_attributes = True


# Assessment Schemas
class AssessmentBase(BaseModel):
    course_id: UUID
    enrollment_id: UUID
    lecturer_id: UUID
    assessment_type: AssessmentType
    title: str
    max_score: float = 100.0
    score: float
    weight: Optional[float] = None
    assessment_date: date
    remarks: Optional[str] = None


class AssessmentCreate(AssessmentBase):
    pass


class AssessmentResponse(AssessmentBase):
    id: UUID
    created_at: datetime
    updated_at: datetime

    class Config:
        from_attributes = True
