import type { GraphqlContext } from "../context.js";
import type { SelectChildResultType } from "../types.js";
import type { ResolverDeps } from "./index.js";
import { logger } from "../../shared/observability/logger.js";

/**
 * SelectChild Mutation Resolver（对齐 02-architecture-design.md §9 #3 + workline P4.5）。
 *
 * 方案 A（02 §2.2）：BFF 无状态，selectChild 仅审计日志，不持久化会话。
 *
 * - 先 ChildGuard 校验 childId ∈ 家长绑定列表
 * - 记录审计日志（traceId + parentId + childId + timestamp）
 * - 返回 SelectChildResultType（childId + selectedAt + audited=true）
 *
 * 前端切换孩子不需要调此 mutation，仅审计场景调用。
 */
export function buildSelectChildMutationResolver(deps: ResolverDeps) {
  return async (
    _parent: unknown,
    args: { childId: string },
    ctx: GraphqlContext,
  ): Promise<SelectChildResultType> => {
    await deps.childGuard.validateChildAccess(
      ctx.session.parentId,
      args.childId,
    );

    const selectedAt = new Date().toISOString();

    logger.info(
      {
        parentId: ctx.session.parentId,
        childId: args.childId,
        traceId: ctx.session.traceId,
        selectedAt,
      },
      "Child selected (audit log)",
    );

    return {
      childId: args.childId,
      selectedAt,
      audited: true,
    };
  };
}
