// useChildSwitcher：子女切换 Hook
// 依据：02-architecture-design.md §4.3 状态管理分层、ARB-020 §22.5 ISSUE-009 双层裁决
// - 封装 Zustand store，提供派生数据（currentChild / hasMultipleChildren）
// - 切换子女时双层处理：
//   1. 后端审计：调 GraphQL Mutation switchChild（parent-bff 写 Redis parent:selected:{parentId} TTL 30s）
//   2. 前端缓存：Zustand + localStorage + BroadcastChannel（刷新不丢失 + 跨标签同步）
// - 乐观更新：前端缓存立即更新（UX 优先），后端审计 fire-and-forget
// - 自动加载子女列表（useMyChildren）

"use client";

import { useMutation } from "urql";
import { useChildStore } from "@/store/child-store";
import { useMyChildren } from "./useMyChildren";
import { SWITCH_CHILD } from "@/lib/graphql/operations";

export function useChildSwitcher() {
  const { children, loading, error } = useMyChildren();

  const currentChildId = useChildStore((s) => s.currentChildId);
  const switchChildLocal = useChildStore((s) => s.switchChild);

  const [, switchChildMutation] = useMutation(SWITCH_CHILD);

  const currentChild = children.find((c) => c.id === currentChildId) ?? null;
  const hasMultipleChildren = children.filter((c) => !c.isArchived).length > 1;

  // ARB-020 §22.5：双层 switchChild（后端审计 + 前端缓存）
  const switchChild = (childId: string) => {
    // 1. 前端缓存立即更新（乐观更新，UX 优先）
    switchChildLocal(childId);

    // 2. 后端审计记录（fire-and-forget，失败不阻塞 UI、不回滚缓存）
    void switchChildMutation({ childId }).then((result) => {
      if (result.error) {
        // 审计失败仅记录，不回滚前端状态（缓存优先于审计）
        // 后端 ChildGuard 会兜底拦截越权查询
        console.warn(
          "[switchChild] 后端审计 mutation 失败（前端缓存已更新）",
          result.error.message,
        );
      }
    });
  };

  return {
    children,
    currentChild,
    currentChildId,
    switchChild,
    loading,
    error,
    hasMultipleChildren,
  };
}
