"use server"

import { revalidatePath } from "next/cache"

import type { ActionState } from "@/shared/types/action-state"
import { requirePermission } from "@/shared/lib/auth-guard"
import { Permissions } from "@/shared/types/permissions"
import { storageProvider } from "@/shared/lib/storage-provider"
import { getUserProfile, updateUserAvatar } from "@/modules/users/data-access"
import {
  deleteFileAttachment,
  getFileByUrl,
} from "@/modules/files/data-access"

/**
 * 清理旧头像文件（磁盘 + DB 记录）
 * 静默失败，不影响主流程
 *
 * P1-4：磁盘删除统一走 storageProvider 抽象，
 * 不再直接 import fs/promises。
 */
async function cleanupOldAvatarFile(oldImageUrl: string | null): Promise<void> {
  if (!oldImageUrl) return
  try {
    const fileRecord = await getFileByUrl(oldImageUrl)
    if (!fileRecord) return

    // 删除磁盘文件（通过 storageProvider 抽象）
    await storageProvider.delete(fileRecord.storagePath)

    // 删除 DB 记录
    await deleteFileAttachment(fileRecord.id)
  } catch (error) {
    console.error("cleanupOldAvatarFile failed:", error)
  }
}

/**
 * 更新用户头像 URL
 *
 * 实际文件上传通过 /api/upload 路由完成（targetType="user_avatar"），
 * 此 action 仅更新 users.image 字段。
 * 更新成功后会清理旧头像文件（磁盘 + DB 记录）。
 */
export async function updateUserAvatarAction(
  imageUrl: string
): Promise<ActionState<{ image: string }>> {
  try {
    const ctx = await requirePermission(Permissions.USER_PROFILE_UPDATE)

    // 获取旧头像 URL，用于后续清理
    const oldUser = await getUserProfile(ctx.userId)
    const oldImageUrl = oldUser?.image ?? null

    const updated = await updateUserAvatar(ctx.userId, imageUrl)
    if (!updated) {
      return { success: false, message: "User not found" }
    }

    // 更新成功后清理旧头像文件（仅当新旧 URL 不同时）
    if (oldImageUrl && oldImageUrl !== imageUrl) {
      await cleanupOldAvatarFile(oldImageUrl)
    }

    revalidatePath("/profile")
    revalidatePath("/settings")

    return { success: true, data: { image: updated.image ?? imageUrl } }
  } catch (error) {
    const message = error instanceof Error ? error.message : "Failed to update avatar"
    return { success: false, message }
  }
}

/**
 * 移除用户头像
 * 同时清理旧头像文件（磁盘 + DB 记录）
 */
export async function removeUserAvatarAction(): Promise<ActionState<null>> {
  try {
    const ctx = await requirePermission(Permissions.USER_PROFILE_UPDATE)

    // 获取旧头像 URL，用于后续清理
    const oldUser = await getUserProfile(ctx.userId)
    const oldImageUrl = oldUser?.image ?? null

    const updated = await updateUserAvatar(ctx.userId, null)
    if (!updated) {
      return { success: false, message: "User not found" }
    }

    // 更新成功后清理旧头像文件
    if (oldImageUrl) {
      await cleanupOldAvatarFile(oldImageUrl)
    }

    revalidatePath("/profile")
    revalidatePath("/settings")

    return { success: true, data: null }
  } catch (error) {
    const message = error instanceof Error ? error.message : "Failed to remove avatar"
    return { success: false, message }
  }
}
