'use client';

import { useEffect } from 'react';
import { useRouter } from 'next/navigation';
import { Permission } from '@pac/types';
import { useHasPermission } from '@/hooks/use-permission';
import { SupervisorWorkbench } from '@/components/supervisor/supervisor-workbench';

/**
 * /supervisor — 主管工作台。
 *
 * 🔴 **它是一条独立路由，这推翻了 T16 的后半句**（2026-08-04 产品评审定，doctrine 已改写）。
 *   原教条：「矩阵是池子的一个视图模式，不新开路由 —— 主管本质也是客服，
 *   割裂成两个页面会把他劈成两个身份」。评审上需求方三次讲同一件事：
 *   「场景和思路不应该去混」「领导想的是怎么制定战略，到你这儿人就应该执行」
 *   「不搭嘎的事情混在一起」。
 *
 * ⚠️ T16 里**没被推翻**的那半句仍然作数：主管也要打电话。所以头部常驻
 *   「客服执行页 ↗」，两个页面是双向的 —— ⛔ 别做成有去无回。
 *
 * 权限走 `PLAN_DISPATCH`（派单权），与召回池 tab 同一把闸。
 */
export default function SupervisorPage() {
  const router = useRouter();
  const canDispatch = useHasPermission(Permission.PLAN_DISPATCH);

  /**
   * 🔴 **没有派单权的（客服）弹回执行页**，⛔ 不能只是"不渲染"。
   *
   * 这里原来包的是 `<Can perm={PLAN_DISPATCH}>`，而 `Can` **没给 fallback 就渲染 null** ——
   * 客服落到这条路由看到的是**一整片纯白**：不报错、没提示、也没有任何出口，
   * 只能自己去改地址栏（2026-08-08 实测：模拟登录成功后会**留在当前 URL**，
   * 于是在工作台上切成客服身份，就直接白屏了；收藏夹/分享链接同理）。
   *
   * ⚠️ 这是 `/plans` 那条规则的**镜像**，两边合起来才是完整的：
   *     有派单权 + 没带 `?exec=1` → /plans     跳 /supervisor
   *     没有派单权               → /supervisor 跳 /plans
   *   ⛔ 不会来回弹：两个条件互斥（`canDispatch` 真/假各占一边），
   *     且这边**不看** `?exec=1`（那个开关只表达"主管要去执行页"，客服身上没有意义）。
   * ⭐ 不存在"权限没加载完就抢跑"：`permissions` 来自 **JWT 即时解码**，
   *   而 `AuthGate` 拿到 token 才渲染 children —— 本组件挂载时它一定已经在了。
   *   ⚠️ 别和 `clinicIds` 搞混，**那个**才是 `/auth/session` 异步回来的。
   */
  useEffect(() => {
    if (!canDispatch) router.replace('/plans');
  }, [canDispatch, router]);

  if (!canDispatch) return null;
  return <SupervisorWorkbench />;
}
