import datetime

from sqlalchemy import delete, select
from sqlalchemy.ext.asyncio import AsyncSession

from database.schemas import UforaAnnouncement, UforaCourse

__all__ = ["create_new_announcement", "get_courses_with_announcements", "remove_old_announcements"]


async def get_courses_with_announcements(session: AsyncSession) -> list[UforaCourse]:
    """Get all courses where announcements are enabled"""
    statement = select(UforaCourse).where(UforaCourse.log_announcements)
    return (await session.execute(statement)).scalars().all()


async def create_new_announcement(
    session: AsyncSession, announcement_id: int, course: UforaCourse, publication_date: datetime.datetime
) -> UforaAnnouncement:
    """Add a new announcement to the database"""
    new_announcement = UforaAnnouncement(
        announcement_id=announcement_id, course=course, publication_date=publication_date
    )
    session.add(new_announcement)
    await session.commit()
    return new_announcement


async def remove_old_announcements(session: AsyncSession):
    """Delete all announcements that are > 8 days old

    The RSS feed only goes back 7 days, so all of these old announcements never have to
    be checked again when checking if an announcement is fresh or not.
    """
    limit = datetime.datetime.utcnow() - datetime.timedelta(days=8)
    statement = delete(UforaAnnouncement).where(UforaAnnouncement.publication_date < limit)
    await session.execute(statement)
    await session.commit()