import type { ActionState } from "@/shared/types/action-state"
import type { UpdateUserProfileInput, UserProfile } from "@/modules/users/data-access"
import type {
  NotificationPreferences,
  UpdateNotificationPreferencesInput,
} from "@/modules/notifications/types"

export type AiProviderName = "zhipu" | "openai" | "gemini" | "custom" | "ollama"

/**
 * AI 服务商可见性
 * - public: 管理员发布，全员可用
 * - private: 仅创建者可见
 */
export type AiProviderVisibility = "public" | "private"

export interface AiProviderSummary {
  id: string
  provider: AiProviderName
  baseUrl: string | null
  model: string
  apiKeyLast4: string | null
  isDefault: boolean
  visibility: AiProviderVisibility
  createdBy: string | null
  updatedAt: Date
}

export interface AiProviderExisting {
  id: string
  apiKeyEncrypted: string
  apiKeyLast4: string | null
  isDefault: boolean
  visibility: AiProviderVisibility
  createdBy: string | null
}

/**
 * 个人资料服务接口（解耦 settings 组件对 users/actions 的直接依赖）
 *
 * 由页面层注入实现，组件层通过 useSettingsService().profile 消费。
 * 注意：getProfile 为可选，因为数据已通过 props 传递；
 * updateProfile 必须是 "use server" 标记的 Server Action 引用。
 */
export interface ProfileService {
  getProfile?: () => Promise<UserProfile | null>
  updateProfile: (input: UpdateUserProfileInput) => Promise<ActionState<void>>
}

/**
 * 通知偏好服务接口（解耦 settings 组件对 messaging/actions 的直接依赖）
 *
 * 由页面层注入实现，组件层通过 useSettingsService().notifications 消费。
 * 注意：getPreferences 为可选，因为数据已通过 props 传递；
 * updatePreferences 必须是 "use server" 标记的 Server Action 引用。
 */
export interface NotificationPreferenceService {
  getPreferences?: () => Promise<NotificationPreferences>
  updatePreferences: (
    input: UpdateNotificationPreferencesInput
  ) => Promise<ActionState<NotificationPreferences>>
}

/**
 * 设置模块统一服务接口
 *
 * 通过 React Context 注入，组件层不直接 import 其他业务模块的 actions。
 * 不同角色或测试场景可注入不同实现。
 */
export interface SettingsService {
  profile: ProfileService
  notifications: NotificationPreferenceService
  /** 预留埋点接口 */
  trackEvent?: (event: string, payload?: Record<string, unknown>) => void
}
