import common from "../common/common.mjs";
import constants from "../common/constants.mjs";
const { bitbucket } = common.props;
export default {
  ...common,
  type: "source",
  name: "New Commit Comment (Instant)",
  key: "bitbucket-new-commit-comment",
  description: "Emit new event when a commit receives a comment. [See docs here](https://developer.atlassian.com/cloud/bitbucket/rest/api-group-repositories/#api-repositories-workspace-repo-slug-hooks-post)",
  version: "0.0.4",
  props: {
    ...common.props,
    repositoryId: {
      propDefinition: [
        bitbucket,
        "repository",
        (c) => ({
          workspaceId: c.workspaceId,
        }),
      ],
    },
  },
  methods: {
    ...common.methods,
    getPath() {
      return `repositories/${this.workspaceId}/${this.repositoryId}/hooks`;
    },
    getWebhookEventTypes() {
      return [
        "repo:commit_comment_created",
      ];
    },
    async loadHistoricalData() {
      const commits = await this.bitbucket.getCommits({
        workspaceId: this.workspaceId,
        repositoryId: this.repositoryId,
        params: {
          include: this.branchName,
          page: 1,
          pagelen: constants.HISTORICAL_DATA_LENGTH,
        },
      });
      if (commits?.length) {
        let counter = 0;
        let comments = [];
        do {
          const response = await this.bitbucket.getCommitComments({
            workspaceId: this.workspaceId,
            repositoryId: this.repositoryId,
            commitId: commits[counter].hash,
            params: {
              page: 1,
              pagelen: constants.HISTORICAL_DATA_LENGTH,
            },
          });
          comments = [
            ...comments,
            ...response,
          ];
          counter++;
          if (comments.length > constants.HISTORICAL_DATA_LENGTH) {
            break;
          }
          if (counter >= commits.length - 1) {
            break;
          }
        } while (true);
        return comments.map((comment) => ({
          main: comment,
          sub: {
            id: comment.id,
            summary: `New comment created on commit ${comment.commit.hash}`,
            ts: Date.parse(comment.created_on),
          },
        }));
      }
    },
    proccessEvent(event) {
      const { comment } = event.body;
      this.$emit(comment, {
        id: comment.id,
        summary: `New comment created on commit ${comment.commit.hash}`,
        ts: Date.parse(comment.created_on),
      });
    },
  },
};