"""Check a token before you rely on it: who it is, what it may do, when it expires.

  SLFLO_TOKEN=sfi_live_... python3 check_token.py

Exit 0: the token works (a warning is printed under 30 days to expiry). Exit 3: it was refused.
Run it with the new token after a rotation, before you revoke the old one.
"""
import sys
from datetime import date, datetime, timezone

from slflo import Slflo, TokenRefused, report

WARN_DAYS = 30


# region check
def check(api):
    me = api.get("/me")["data"]
    expires_at = me["client"].get("token_expires_at")
    days_left = None
    if expires_at:
        days_left = (date.fromisoformat(expires_at[:10]) - datetime.now(timezone.utc).date()).days
    if days_left is not None and days_left < WARN_DAYS:
        print(f"warning: this token expires in {days_left} days; rotate it", file=sys.stderr)
    return {
        "ok": True,
        "client": me["client"]["name"],
        "token_prefix": me["client"]["token_prefix"],
        "company": me["company"]["code"],
        "scopes": me["scopes"],
        "days_left": days_left,
        "rate_limit_per_minute": me["client"]["rate_limit_per_minute"],
    }
# endregion


def main():
    try:
        report(check(Slflo()))
        return 0
    except TokenRefused as refused:
        report({"ok": False, "refused": refused.code})
        return 3


if __name__ == "__main__":
    sys.exit(main())
