from sqlalchemy import Column, String, Integer, Date, Float, ForeignKey, Text, Time, Boolean
from sqlalchemy.orm import relationship

from models.base import Base, TimestampMixin


class Course(Base, TimestampMixin):
    __tablename__ = 'course'
    id = Column(Integer, primary_key=True, autoincrement=True, index=True)
    course_category_id = Column(Integer, ForeignKey('course_category.id'), nullable=False)
    age_group_id = Column(Integer, ForeignKey('age_groups.id'), nullable=False)
    time_slot_id = Column(Integer, ForeignKey('time_slots.id'), nullable=False)
    term_id = Column(Integer, ForeignKey('term.id'), nullable=True)
    academic_year_id = Column(Integer, ForeignKey('academic_year.id'), nullable=True)
    name = Column(String(255), nullable=False)
    description = Column(Text, nullable=True)
    short_description = Column(Text, nullable=True)
    image = Column(Text, nullable=True)
    sku = Column(String(255), nullable=True,unique=True)
    start_date = Column(Date, nullable=True)
    end_date = Column(Date, nullable=True)
    start_time = Column(Time, nullable=True)
    end_time = Column(Time, nullable=True)
    no_of_seats = Column(Integer, nullable=False)
    amount = Column(Float, nullable=False)
    is_bursary_product = Column(Boolean, nullable=False)
    total_no_terms = Column(Integer, default=0)
    no_days_in_term = Column(Integer, default=0)
    no_weeks_in_term = Column(Integer, default=0)
    is_enable_waitlist = Column(Boolean, default=False)
    waiting_list_limit = Column(Integer, default=0)
    is_special_course = Column(Boolean, default=False)
    rate_per_class = Column(Float, nullable=True)
    no_of_classes = Column(Integer, nullable=True)
    term=relationship("Term")
    course_category=relationship("CourseCategory")
    age_group=relationship("AgeGroup")
    time_slot=relationship("TimeSlot")
    academic_year=relationship("AcademicYear")
    payment_details=relationship("PaymentDetails",back_populates="course")

    @property
    def image_url(self):
        if self.image:
            return f"/images/{self.image}"
        return self.image

    @property
    def remaining_seat(self):
        completed_payments = [
            p for p in self.payment_details if p.payment.is_payment_completed is True
        ]
        payment_count = len(completed_payments)
        print(payment_count)
        return max(0, self.no_of_seats - payment_count)



