classDiagram
    class User {
        -username: String
        -password: String
        +login() : boolean
    }

    class Admin {
        +viewTeachers() : List[Teacher]
        +deleteTeacher(teacherId: int) : boolean
    }

    class Teacher {
        -teacherId: int
        -name: String
        -subject: String
        -email: String
        -phoneNumber: String
        -address: String
        -loginPassword: String
        +addAvailability(slot: AvailabilitySlot) : boolean
        +updateStatus(status: String) : boolean
        +viewAvailability() : List[AvailabilitySlot]
    }

    class Student {
        -studentId: int
        -name: String
        -email: String
        +viewTeacherAvailability() : List[AvailabilitySlot]
        +makeAppointment(slot: AvailabilitySlot) : boolean
    }

    class Appointment {
        -appointmentId: int
        -student: Student
        -teacher: Teacher
        -appointmentTime: DateTime
        -status: String
        +approve() : boolean
        +deny() : boolean
        +cancel() : boolean
    }

    class Comment {
        -commentId: int
        -student: Student
        -teacher: Teacher
        -content: String
        -rating: int
    }

    class AvailabilitySlot {
        -slotId: int
        -teacher: Teacher
        -startTime: DateTime
        -endTime: DateTime
        -status: String
        +reserve(student: Student) : boolean
        +deny() : boolean
    }

    class LoginBoundary {
        +login(user: User) : void
    }

    class ViewTeacherInfoBoundary {
        +viewTeachers() : List[Teacher]
    }

    class AddTeacherInfoBoundary {
        +addTeacher(teacher: Teacher) : void
    }

    class DeleteTeacherInfoBoundary {
        +deleteTeacher(teacherId: int) : void
    }

    class ViewStudentAppointmentBoundary {
        +viewAppointments() : List[Appointment]
    }

    class AddAvailabilitySlotBoundary {
        +addSlot(slot: AvailabilitySlot) : void
    }

    class TeacherStatusUpdateBoundary {
        +updateStatus(teacher: Teacher, status: String) : void
    }

    class TeacherAvailabilityViewBoundary {
        +viewAvailability() : List[AvailabilitySlot]
    }

    class StudentAvailabilityViewBoundary {
        +viewAvailability() : List[AvailabilitySlot]
    }

    %% Relationships
    User <|-- Admin
    User <|-- Teacher
    User <|-- Student

    AvailabilitySlot "1" --> "0..*" Appointment : contains
    Teacher "1" --> "1..*" AvailabilitySlot : has
    Student "1" --> "0..*" Appointment : has
    Appointment "0..*" --> "0..*" Comment : includes
