import type { NormalizedRole } from "@/shared/lib/role-utils"
import type { Role } from "@/shared/types/permissions"

// ---------------------------------------------------------------------------
// audit-P1-13：Onboarding 步骤配置驱动设计
//
// 原先步骤列表与角色过滤逻辑硬编码在 use-onboarding-form.ts 中
// （`STEPS_KEYS` 常量 + `isAdmin ? filter : identity` 三元表达式），
// 新增/调整步骤时必须修改 Hook 逻辑代码。
//
// 现抽取为配置常量 ONBOARDING_STEPS + 纯函数 getOnboardingStepsForRole，
// onboarding-stepper 与 use-onboarding-form 仅消费配置，不再内联步骤定义。
// ---------------------------------------------------------------------------

/** Onboarding 流程的 4 个步骤标识，同时作为 i18n 键后缀（`onboarding.steps.${id}`）。 */
export type OnboardingStepId = "roleConfirm" | "basicInfo" | "roleInfo" | "complete"

/**
 * 单个步骤的配置。
 *
 * - `applicableRoles`：该步骤对哪些角色显示。`undefined` 表示对所有角色显示。
 *   角色不在列表中时，该步骤被完全跳过（例如 admin 与 grade_head/teaching_head
 *   跳过 roleInfo 步骤，因为他们在该步骤无需填写任何内容）。
 * - `canSkip`：返回 true 时显示"跳过"按钮。仅在该步骤对当前角色显示时才有意义。
 *   parent 必须绑定至少一个子女，故 roleInfo 步骤对 parent 不可跳过。
 */
export type OnboardingStepConfig = {
  id: OnboardingStepId
  applicableRoles?: readonly NormalizedRole[]
  canSkip?: (role: NormalizedRole) => boolean
}

/**
 * Onboarding 步骤配置数组（顺序即展示顺序，不可随意调整）。
 *
 * - roleConfirm：角色确认（只读，所有角色）
 * - basicInfo：基础信息（姓名/手机/地址，所有角色）
 * - roleInfo：角色信息（教师填班级码+科目、学生填班级码、家长绑定子女；
 *   仅 teacher/student/parent 显示；admin 与 grade_head/teaching_head 无需填写故跳过）
 * - complete：完成（所有角色）
 */
export const ONBOARDING_STEPS: readonly OnboardingStepConfig[] = [
  { id: "roleConfirm" },
  { id: "basicInfo" },
  {
    id: "roleInfo",
    applicableRoles: ["teacher", "student", "parent"],
    canSkip: (role) => role !== "parent",
  },
  { id: "complete" },
]

/**
 * 返回给定角色适用的步骤列表（保持 ONBOARDING_STEPS 中的顺序）。
 *
 * 用法：`const steps = getOnboardingStepsForRole(primaryRole)`
 * `steps[stepIndex].id` 即当前步骤标识。
 */
export function getOnboardingStepsForRole(
  role: NormalizedRole,
): readonly OnboardingStepConfig[] {
  return ONBOARDING_STEPS.filter(
    (step) => !step.applicableRoles || step.applicableRoles.includes(role),
  )
}

/**
 * 家长在 Onboarding 中填写的子女信息行（P1-2 拆分时从 onboarding-stepper.tsx 提取）。
 * 三因子验证：邮箱 + 生日 + 手机号后 4 位。
 */
export type ChildRow = {
  childEmail: string
  childBirthDate: string
  childPhoneSuffix: string
  childRelation: string
}

export const EMPTY_CHILD_ROW: ChildRow = {
  childEmail: "",
  childBirthDate: "",
  childPhoneSuffix: "",
  childRelation: "",
}

/**
 * Onboarding 步骤中展示给用户的角色信息。
 * 角色来源于 usersToRoles（管理员预分配），用户不可修改。
 */
export type OnboardingRoleInfo = {
  /** 规范化后的主角色（admin/grade_head/teaching_head/teacher/student/parent） */
  primary: NormalizedRole
  /** 用户拥有的全部角色名（含 grade_head/teaching_head 等） */
  all: Role[]
}

/**
 * Onboarding 状态查询结果。
 */
export type OnboardingStatus = {
  required: boolean
  roles: OnboardingRoleInfo
  /** 预填的姓名（来自 users.name） */
  name: string
}

/**
 * Onboarding 完成动作的返回数据。
 */
export type OnboardingCompleteData = {
  /** 完成后应跳转的默认路径（按角色路由） */
  defaultPath: string
}

/**
 * Onboarding 局部失败项（P1-2：班级码/子女绑定失败不回滚整个事务）。
 * 对标 Auth0 Action 错误处理：收集失败列表返回前端，成功项保留。
 */
export type OnboardingFailureItem = {
  /** 失败类型：班级码绑定 / 子女绑定 */
  type: "class_code" | "child_binding"
  /** 失败的标识（班级码或子女邮箱） */
  code: string
  /** 失败原因 */
  message: string
}

/**
 * 家长绑定子女的输入参数（v3 P0-2：三因子验证）。
 */
export type BindParentToChildParams = {
  parentId: string
  childEmail: string
  /** 验证因子 1：子女生日（YYYY-MM-DD） */
  childBirthDate: string
  /** 验证因子 2：子女手机号后 4 位（v3 新增，对标 PowerSchool Access Password） */
  childPhoneSuffix: string
  relation?: string
}
