#!/usr/bin/env bash

set -e

if [ $# -lt 1 ]; then
    echo "Usage: get-pr-comments PR_NUMBER [OWNER/REPO]"
    echo "Example: get-pr-comments 123"
    echo "Example: get-pr-comments 123 owner/repo"
    exit 1
fi

PR_NUMBER=$1

if [ -n "$2" ]; then
    OWNER=$(echo "$2" | cut -d/ -f1)
    REPO=$(echo "$2" | cut -d/ -f2)
else
    OWNER=$(gh repo view --json owner -q .owner.login 2>/dev/null)
    REPO=$(gh repo view --json name -q .name 2>/dev/null)
fi

if [ -z "$OWNER" ] || [ -z "$REPO" ]; then
    echo "Error: Could not detect repository. Pass OWNER/REPO as second argument."
    exit 1
fi

gh api graphql -f owner="$OWNER" -f repo="$REPO" -F pr="$PR_NUMBER" -f query='
query FetchUnresolvedComments($owner: String!, $repo: String!, $pr: Int!) {
  repository(owner: $owner, name: $repo) {
    pullRequest(number: $pr) {
      title
      url
      reviewThreads(first: 100) {
        totalCount
        edges {
          node {
            id
            isResolved
            isOutdated
            isCollapsed
            path
            line
            startLine
            diffSide
            comments(first: 100) {
              totalCount
              nodes {
                id
                author {
                  login
                }
                body
                createdAt
                updatedAt
                url
                outdated
              }
            }
          }
        }
        pageInfo {
          hasNextPage
          endCursor
        }
      }
    }
  }
}' | jq '
  .data.repository.pullRequest.reviewThreads.edges as $edges
  | {
      unresolved: ($edges | map(select(.node.isResolved == false and .node.isOutdated == false))),
      cross_invocation: {
        signal: (($edges | map(select(.node.isResolved == true)) | length) > 0
                 and ($edges | map(select(.node.isResolved == false and .node.isOutdated == false)) | length) > 0),
        resolved_threads: ($edges | map(select(.node.isResolved == true)) | map({
          node: {id: .node.id, path: .node.path, line: .node.line}
        }))
      }
    }'
