// 認証ゲートの外側で扱う公開ルートのパスマッチ（純関数・DOM 非依存）。
//
// App.tsx はこの結果を見て、認証前に SharedView / JoinSpace / SharedAppView を
// 直接返す。トークンは decodeURIComponent 済み。マッチしなければ null（=通常の
// 認証アプリへ）。

export type PublicRoute =
  | { kind: 'shared'; token: string } // /ui/shared/:token  共有タスク（read-only）
  | { kind: 'invite'; token: string } // /ui/invite/:token  招待リンク
  | { kind: 'app'; token: string };   // /ui/app/:token     公開アプリ（read-only）

const ROUTES: { kind: PublicRoute['kind']; re: RegExp }[] = [
  { kind: 'shared', re: /^\/ui\/shared\/([^/]+)/ },
  { kind: 'invite', re: /^\/ui\/invite\/([^/]+)/ },
  { kind: 'app', re: /^\/ui\/app\/([^/]+)/ },
];

export function matchPublicRoute(pathname: string): PublicRoute | null {
  for (const { kind, re } of ROUTES) {
    const m = pathname.match(re);
    if (m) {
      let token = m[1];
      try {
        token = decodeURIComponent(m[1]);
      } catch {
        // 不正な %xx はそのまま（呼び出し側の API が 404 で弾く）
      }
      return { kind, token };
    }
  }
  return null;
}
