"use client";

import { createContext, useContext, useMemo, type ReactNode } from "react";
import type { LessonPlanListItem, LessonPlanVersion } from "../types";

/**
 * 备课模块数据服务接口（P1-7）。
 * 抽象数据依赖，各角色/测试可提供不同实现，通过 LessonPlanProvider 注入。
 * 组件不直接 import actions，只通过此接口调用。
 */
export interface LessonPlanDataService {
  /** 查询课案列表 */
  getLessonPlans(params?: {
    query?: string;
    textbookId?: string;
    chapterId?: string;
    subjectId?: string;
    status?: string;
  }): Promise<{ success: boolean; data?: { items: LessonPlanListItem[] }; message?: string }>;

  /** 获取课案版本列表 */
  getLessonPlanVersions(planId: string): Promise<{
    success: boolean;
    data?: { versions: LessonPlanVersion[] };
    message?: string;
  }>;

  /** 回退到指定版本 */
  revertLessonPlanVersion(params: {
    planId: string;
    versionNo: number;
  }): Promise<{ success: boolean; message?: string }>;

  /** 复制课案 */
  duplicateLessonPlan(planId: string): Promise<{ success: boolean; message?: string }>;

  /** 删除/归档课案 */
  deleteLessonPlan(planId: string): Promise<{ success: boolean; message?: string }>;
}

/**
 * 角色配置（P1-7）：决定该模块渲染哪些 Widget/子模块/操作。
 * 新增角色只需新增配置项，不改组件代码。
 */
export interface LessonPlanRoleConfig {
  /** 是否显示"新建课案"按钮 */
  canCreate: boolean;
  /** 是否显示"编辑"入口 */
  canEdit: boolean;
  /** 是否显示"发布为作业" */
  canPublish: boolean;
  /** 是否显示"复制" */
  canDuplicate: boolean;
  /** 是否显示"归档/删除" */
  canArchive: boolean;
  /** 是否显示"版本历史" */
  canViewVersions: boolean;
  /** 是否显示"AI 知识点建议" */
  canUseAiSuggest: boolean;
  /** 是否只读模式（学生/家长查看 published 课案） */
  readOnly: boolean;
}

/** 默认教师配置 */
export const TEACHER_ROLE_CONFIG: LessonPlanRoleConfig = {
  canCreate: true,
  canEdit: true,
  canPublish: true,
  canDuplicate: true,
  canArchive: true,
  canViewVersions: true,
  canUseAiSuggest: true,
  readOnly: false,
};

/** 管理员配置（查看全校课案，不可编辑） */
export const ADMIN_ROLE_CONFIG: LessonPlanRoleConfig = {
  canCreate: false,
  canEdit: false,
  canPublish: false,
  canDuplicate: false,
  canArchive: false,
  canViewVersions: true,
  canUseAiSuggest: false,
  readOnly: true,
};

/** 学生配置（仅查看 published） */
export const STUDENT_ROLE_CONFIG: LessonPlanRoleConfig = {
  canCreate: false,
  canEdit: false,
  canPublish: false,
  canDuplicate: false,
  canArchive: false,
  canViewVersions: false,
  canUseAiSuggest: false,
  readOnly: true,
};

/** 家长配置（查看孩子的 published 课案） */
export const PARENT_ROLE_CONFIG: LessonPlanRoleConfig = {
  canCreate: false,
  canEdit: false,
  canPublish: false,
  canDuplicate: false,
  canArchive: false,
  canViewVersions: false,
  canUseAiSuggest: false,
  readOnly: true,
};

/** 角色配置注册表 */
export const ROLE_CONFIGS: Record<string, LessonPlanRoleConfig> = {
  admin: ADMIN_ROLE_CONFIG,
  teacher: TEACHER_ROLE_CONFIG,
  student: STUDENT_ROLE_CONFIG,
  parent: PARENT_ROLE_CONFIG,
};

/** 监控埋点接口（P2-4）：预留关键操作埋点 */
export interface LessonPlanTracker {
  track(event: string, payload?: Record<string, unknown>): void;
}

/** 默认空实现埋点（生产环境可替换为真实埋点） */
export const noopTracker: LessonPlanTracker = {
  track: () => {},
};

/** 备课模块上下文值 */
export interface LessonPlanContextValue {
  /** 数据服务（抽象数据依赖） */
  service: LessonPlanDataService;
  /** 角色配置 */
  roleConfig: LessonPlanRoleConfig;
  /** 监控埋点 */
  tracker: LessonPlanTracker;
}

const LessonPlanContext = createContext<LessonPlanContextValue | null>(null);

/** Provider 组件：注入数据服务、角色配置、埋点 */
export function LessonPlanProvider({
  children,
  service,
  roleConfig,
  tracker = noopTracker,
}: {
  children: ReactNode;
  service: LessonPlanDataService;
  roleConfig: LessonPlanRoleConfig;
  tracker?: LessonPlanTracker;
}) {
  const value = useMemo<LessonPlanContextValue>(
    () => ({ service, roleConfig, tracker }),
    [service, roleConfig, tracker],
  );
  return <LessonPlanContext.Provider value={value}>{children}</LessonPlanContext.Provider>;
}

/** Hook：获取备课模块上下文值（若未在 Provider 内则返回 null，不抛错） */
export function useLessonPlanContextSafe(): LessonPlanContextValue | null {
  return useContext(LessonPlanContext);
}

/** Hook：获取备课模块上下文值（必须在 Provider 内使用） */
export function useLessonPlanContext(): LessonPlanContextValue {
  const ctx = useContext(LessonPlanContext);
  if (!ctx) {
    throw new Error("useLessonPlanContext 必须在 LessonPlanProvider 内使用");
  }
  return ctx;
}

/** Hook：获取角色配置（若未在 Provider 内则返回教师默认配置） */
export function useRoleConfig(): LessonPlanRoleConfig {
  const ctx = useContext(LessonPlanContext);
  return ctx?.roleConfig ?? TEACHER_ROLE_CONFIG;
}

/** Hook：获取数据服务 */
export function useLessonPlanService(): LessonPlanDataService {
  return useLessonPlanContext().service;
}

/** Hook：获取埋点 */
export function useLessonPlanTracker(): LessonPlanTracker {
  return useLessonPlanContext().tracker;
}

/** Hook：获取埋点（若未在 Provider 内则返回 noopTracker，不抛错） */
export function useLessonPlanTrackerSafe(): LessonPlanTracker {
  const ctx = useContext(LessonPlanContext);
  return ctx?.tracker ?? noopTracker;
}
