from datetime import date, datetime, timedelta, timezone

TR_UTC_OFFSET_HOURS = 3
MIN_LEAD_MINUTES = 10


def compute_publish_at(hour: int, target_date: date | None = None) -> str:
    now_utc = datetime.now(timezone.utc)

    if target_date is None:
        target_date = (now_utc + timedelta(hours=TR_UTC_OFFSET_HOURS)).date()

    target_tr = datetime(target_date.year, target_date.month, target_date.day, hour, 0, 0, tzinfo=timezone.utc)
    target_utc = target_tr - timedelta(hours=TR_UTC_OFFSET_HOURS)

    # Never submit a publishAt that has already passed (or is about to) --
    # YouTube publishes immediately in that case instead of holding it private.
    if target_utc <= now_utc + timedelta(minutes=MIN_LEAD_MINUTES):
        target_utc += timedelta(days=1)

    return target_utc.strftime("%Y-%m-%dT%H:%M:%SZ")
