import { resolveBaseUrl, instance, base64DecodeUtf8, encodeProject } from './helper.mjs';
import 'axios';

/**
 * 获取仓库中指定文件的内容（自动 base64 解码）
 *
 * 对应工蜂 API：GET /api/v3/projects/:id/repository/files
 *
 * @param {object} options 输入配置
 * @param {string | number} options.projectName 项目名称或项目 ID
 * @param {string} options.filePath 文件路径（如 src/utils/helper.ts）
 * @param {string} [options.ref='master'] 分支名或 commit SHA
 * @param {string} options.privateToken 密钥
 * @param {string} [options.baseUrl] baseUrl
 * @returns {Promise<RepoFile>} 文件内容（已解码）
 * @example
 *
 * getFileContent({
 *   projectName: 'group/sub/repo',
 *   filePath: 'src/utils/helper.ts',
 *   ref: 'master',
 *   privateToken: 'xxxxx',
 * }).then(file => console.log(file.content));
 */
function getFileContent(_ref) {
  var projectName = _ref.projectName,
    filePath = _ref.filePath,
    _ref$ref = _ref.ref,
    ref = _ref$ref === void 0 ? 'master' : _ref$ref,
    privateToken = _ref.privateToken,
    baseUrl = _ref.baseUrl;
  return new Promise(function (resolve, reject) {
    if (!projectName || !filePath) {
      reject(new Error('projectName, filePath is required'));
      return;
    }
    var url = resolveBaseUrl(baseUrl, "/api/v3/projects/".concat(encodeProject(projectName), "/repository/files"));
    instance({
      url: url,
      method: 'GET',
      params: {
        file_path: filePath,
        ref: ref
      },
      headers: {
        'PRIVATE-TOKEN': privateToken
      }
    }).then(function (res) {
      var raw = res.data;
      resolve({
        content: (raw === null || raw === void 0 ? void 0 : raw.content) ? base64DecodeUtf8(raw.content) : '',
        encoding: raw === null || raw === void 0 ? void 0 : raw.encoding,
        sha: raw === null || raw === void 0 ? void 0 : raw.blob_id
      });
    })["catch"](function (err) {
      reject(err);
    });
  });
}
/**
 * 更新仓库中的文件（通过 API 提交，不需要 clone）
 *
 * 对应工蜂 API：PUT /api/v3/projects/:id/repository/files
 *
 * @param {object} options 输入配置
 * @param {string | number} options.projectName 项目名称或项目 ID
 * @param {string} options.filePath 文件路径
 * @param {string} options.content 新的文件内容（纯文本）
 * @param {string} options.commitMessage 提交消息
 * @param {string} options.branch 目标分支
 * @param {string} options.privateToken 密钥
 * @param {string} [options.baseUrl] baseUrl
 * @returns {Promise<{ file_path: string; branch_name: string } & Record<string, unknown>>}
 * @example
 *
 * updateFile({
 *   projectName: 'group/sub/repo',
 *   filePath: 'src/utils/helper.ts',
 *   content: 'export const x = 1;\n',
 *   commitMessage: 'chore: update helper',
 *   branch: 'master',
 *   privateToken: 'xxxxx',
 * }).then((resp) => {
 *
 * })
 */
function updateFile(_ref2) {
  var projectName = _ref2.projectName,
    filePath = _ref2.filePath,
    content = _ref2.content,
    commitMessage = _ref2.commitMessage,
    branch = _ref2.branch,
    privateToken = _ref2.privateToken,
    baseUrl = _ref2.baseUrl;
  return new Promise(function (resolve, reject) {
    if (!projectName || !filePath || !branch) {
      reject(new Error('projectName, filePath, branch is required'));
      return;
    }
    var url = resolveBaseUrl(baseUrl, "/api/v3/projects/".concat(encodeProject(projectName), "/repository/files"));
    instance({
      url: url,
      method: 'PUT',
      data: {
        file_path: filePath,
        branch_name: branch,
        content: content,
        commit_message: commitMessage,
        encoding: 'text'
      },
      headers: {
        'PRIVATE-TOKEN': privateToken
      }
    }).then(function (res) {
      resolve(res.data);
    })["catch"](function (err) {
      reject(err);
    });
  });
}

export { getFileContent, updateFile };
