<?php

namespace Acms\Services\Facades;

/**
 * @method static void setConstantsAuthSystemPage(\Field $queryParameter) 認証系ページの定数をセット
 * @method static void redirectToAuthPage(string $type = 'login') ログイン/サインインページへリダイレクト 'login'|'signin' のいずれかを渡す
 * @method static void postLoginProcessing() ログイン処理を実行
 * @method static bool canAccessAdminLoginFromCurrentIp() 管理者ログイン用: 現在のIPアドレスからアクセス可能か判断
 * @method static bool canAccessSigninFromCurrentIp() 一般サインイン用: 現在のIPアドレスからアクセス可能か判断
 * @method static \Acms\Services\Login\AuthSystemResolution resolveAuthSystemRequest() 認証系URLの解決結果（テンプレート表示 or リダイレクト）を取得
 * @method static 'login'|'signin'|null resolveSecretRedirectTarget(?string $blogStatus, ?string $categoryStatus, bool $requiresAuthentication, bool $preferSignin, bool $isAuthRequiredPage, bool $canMemberSignin, bool $isMemberAuthSystemPage, bool $isMemberAuthPageFeatureAvailable, bool $canAccessSigninFromCurrentIp, bool $canAccessAdminLoginFromCurrentIp) シークレット遮断のリダイレクト先を解決
 * @method static int findUser(string $email, int $bid) ユーザーIDを検索
 * @method static int createUser(\Field_Validation $user, bool $subscribeLoginAnywhere) ユーザーを作成
 * @method static int addUserFromOauth(array $data) OAuth認証でユーザーを追加
 * @method static void updateUser(int $uid, \Field_Validation $user, bool $subscribeLoginAnywhere = false) ユーザーを更新
 * @method static string createTimedLinkParams(string $context, int $lifetime) タイムリンクパラメータを作成
 * @method static array validateTimedLinkParams(string $key, string $salt, string $context) タイムリンクパラメータを検証
 * @method static bool consumeSingleUseToken(string $key, string $type, string $token) 認証トークンを1件だけ原子的に消費（単一使用）
 * @method static void invalidateAuthTokens(string $key, string $type, string $tokenData) 同一宛先の発行済み認証トークンを無効化
 * @method static void purgeExpiredAuthTokens() 有効期限切れの認証トークンを削除
 * @method static true subscriberActivation(int $uid) 特車ユーザーのアクティベーションを処理
 * @method static void authenticateUser(int $userId) ログインを確定（最終ログイン日時の更新＋パスワード再設定トークンのクリア＋セッション生成）
 * @method static void rehashPasswordOnAuth(int $userId, string $plainPassword, int $currentGeneration) ログイン成功時に旧世代パスワードハッシュを最新世代へ再ハッシュして永続化
 * @method static bool needsPasswordRehash(int $currentGeneration, int $targetGeneration) 旧世代パスワードハッシュを最新世代へ再ハッシュすべきか判定
 * @method static string[] getSinginAuth() 一般サインインできる権限を取得
 * @method static string[] getAdminLoginAuth() 管理ログインできる権限を取得
 * @method static string getLogoutRedirectUrl(int $userId) ログアウト時のリダイレクト先URLを取得
 * @method static bool checkAllowedDevice(array $user) ログインが許可されたデバイスかどうかを確認
 * @method static string userIconFromUri(string $imageUri) ユーザーアイコンのURIを取得
 * @method static never loginRedirect(array $user, string|null $fieldRedirectUrl = null) ログイン後のリダイレクト
 * @method static string|null resizeUserIcon(string $squarePath) ユーザーアイコンをリサイズ
 * @method static void addExtraLoggedInCookie(int $uid) ログインしている場合、権限のCookieを追加
 * @method static void updateSessionClientInfo(int $uid) 同時ログイン判定のための、クライアント情報を更新
 * @method static void removeExtraLoggedInCookie() ログインしている場合、権限のCookieを削除
 * @method static bool isAuthRequiredPage() 現在のページが認証が必要なページかどうか判定
 * @method static bool isLoggedIn(int|null $userId = null) 指定したユーザーがログイン状態かどうか判定
 * @method static int|null sessionUserId() 現在アクセス中のセッションのユーザーID（SUID）を取得
 * @method static bool canMemberSignin() 会員サインイン機能が有効かどうか判定
 * @method static bool isExactPath(int $bid, string $segment) 指定されたパスがブログトップからのパスで余分なパスがないかどうかを判定
 * @method static bool matchExactPath(string $blogCode, string $segment, string $requestPath) ブログコードとセグメントから生成したパスが、リクエストパスと一致するかを判定
 * @method static bool canLoginPage(int $bid, string $segment) 認証前のログインページを表示できるかどうかを判定
 * @method static bool isValidAuthenticatedPath(int $bid, string $segment) ログイン済みユーザーのページで正しいパスかどうかを判定
 * @method static bool isAdminAuthSystemPage() 現在のページが管理者向けの認証系ページかどうか判定
 * @method static bool isMemberAuthSystemPage() 現在のページが会員向けの認証系ページかどうか判定
 */
class Login extends Facade
{
    protected static $instance;

    /**
     * @return string
     */
    protected static function getServiceAlias()
    {
        return 'login';
    }

    /**
     * @return bool
     */
    protected static function isCache()
    {
        return true;
    }
}
