import secrets
from datetime import date

from fastapi import Depends, HTTPException, status
from fastapi.security import HTTPBasic, HTTPBasicCredentials

from ..core.config import Config, get_config
from ..core.depends import get_all_event_dates
from ..core.helpers import EventDates

security = HTTPBasic()


async def user_is_admin(
    credentials: HTTPBasicCredentials = Depends(security),
    cfg: Config = Depends(get_config),
) -> bool:
    """
    True iff der user "admin" ist
    """

    username_correct = secrets.compare_digest(
        credentials.username.lower(),
        cfg.admin.username.lower(),
    )
    password_correct = secrets.compare_digest(
        credentials.password,
        cfg.admin.password,
    )

    return username_correct and password_correct


async def require_admin(
    is_admin: bool = Depends(user_is_admin),
) -> None:
    """
    HTTP 401 iff der user nicht "admin" ist
    """

    if not is_admin:
        raise HTTPException(status.HTTP_401_UNAUTHORIZED, "Wie unhöflich!!!")


async def user_visible_days(
    event_dates: EventDates = Depends(get_all_event_dates),
) -> list[int]:
    """
    User-sichtbare Türchen
    """

    today = date.today()

    return [event for event, date in event_dates.dates.items() if date <= today]


async def user_can_view_day(
    day: int,
    visible_days: list[int] = Depends(user_visible_days),
) -> bool:
    """
    True iff das Türchen von Tag `day` user-sichtbar ist
    """

    return day in visible_days
