from datetime import datetime
from app.extensions import db


class SetoranHafalan(db.Model):
    __tablename__ = 'setoran_hafalan'

    id = db.Column(db.Integer, primary_key=True)
    school_id = db.Column(db.Integer, db.ForeignKey('schools.id'), nullable=False)
    guru_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False)
    murid_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False)
    surah_number = db.Column(db.Integer, nullable=False)
    surah_name = db.Column(db.String(200), nullable=False)
    start_verse = db.Column(db.Integer, nullable=False)
    end_verse = db.Column(db.Integer, nullable=False)
    status = db.Column(db.String(20), nullable=False, default='berjalan')
    five_ayat_completed_at = db.Column(db.DateTime, nullable=True)
    completed_at = db.Column(db.DateTime, nullable=True)
    created_at = db.Column(db.DateTime, default=datetime.utcnow)
    updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)

    guru = db.relationship('User', foreign_keys=[guru_id], backref='setoran_dibimbing')
    murid = db.relationship('User', foreign_keys=[murid_id], backref='setoran_hafalan')
    items = db.relationship(
        'SetoranHafalanAyat',
        backref='setoran',
        lazy='dynamic',
        cascade='all, delete-orphan',
        order_by='SetoranHafalanAyat.verse_number',
    )

    @property
    def completed_count(self):
        loaded_items = self.items
        if hasattr(loaded_items, 'filter_by'):
            return loaded_items.filter_by(is_completed=True).count()
        return sum(1 for item in loaded_items if item.is_completed)

    @property
    def total_count(self):
        loaded_items = self.items
        if hasattr(loaded_items, 'count'):
            return loaded_items.count()
        return len(loaded_items)

    def __repr__(self):
        return f'<SetoranHafalan {self.surah_name} {self.start_verse}-{self.end_verse}>'


class SetoranHafalanAyat(db.Model):
    __tablename__ = 'setoran_hafalan_ayat'

    id = db.Column(db.Integer, primary_key=True)
    setoran_id = db.Column(db.Integer, db.ForeignKey('setoran_hafalan.id'), nullable=False)
    school_id = db.Column(db.Integer, db.ForeignKey('schools.id'), nullable=False)
    verse_number = db.Column(db.Integer, nullable=False)
    verse_key = db.Column(db.String(20), nullable=False)
    verse_text = db.Column(db.Text, nullable=True)
    hukum_bacaan_id = db.Column(db.Integer, db.ForeignKey('hukum_bacaan.id'), nullable=True)
    comment = db.Column(db.Text, nullable=True)
    is_completed = db.Column(db.Boolean, default=False, nullable=False)
    completed_at = db.Column(db.DateTime, nullable=True)
    created_at = db.Column(db.DateTime, default=datetime.utcnow)
    updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)

    hukum_bacaan = db.relationship('HukumBacaan', backref='setoran_ayat')

    def __repr__(self):
        return f'<SetoranHafalanAyat {self.verse_key}>'
