import * as vscode from "vscode";
import * as path from "path";

/**
 * 将相对路径解析为工作区绝对路径
 */
export function resolveWorkspaceFilePath(filePath: string): string {
  if (path.isAbsolute(filePath)) {
    return filePath;
  }

  const workspaceFolders = vscode.workspace.workspaceFolders;
  if (!workspaceFolders || workspaceFolders.length === 0) {
    throw new Error("请先打开一个文件夹作为工作区，这样我就能为您修改文件了");
  }

  return path.join(workspaceFolders[0].uri.fsPath, filePath);
}

/**
 * 使用 VS Code 原生 diff 视图展示文件修改前后对比
 */
export async function showFileDiff(
  filePath: string,
  oldContent: string,
  title?: string
): Promise<void> {
  const absolutePath = resolveWorkspaceFilePath(filePath);
  const fileUri = vscode.Uri.file(absolutePath);
  const newBytes = await vscode.workspace.fs.readFile(fileUri);
  const newContent = Buffer.from(newBytes).toString("utf-8");

  if (oldContent === newContent) {
    return;
  }

  const language = (await vscode.workspace.openTextDocument(fileUri)).languageId;
  const oldDoc = await vscode.workspace.openTextDocument({
    content: oldContent,
    language,
  });

  const diffTitle = title || `${path.basename(absolutePath)} (修改前 <-> 修改后)`;
  await vscode.commands.executeCommand(
    "vscode.diff",
    oldDoc.uri,
    fileUri,
    diffTitle,
    { preview: false }
  );
}
