#!/bin/bash
# issue-assign.sh - Assign issues on Gitea or GitHub
# Usage: issue-assign.sh -i ISSUE_NUMBER [-a assignee] [-l labels] [-m milestone]

set -e

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "$SCRIPT_DIR/detect-platform.sh"

# Default values
ISSUE=""
ASSIGNEE=""
LABELS=""
MILESTONE=""
REMOVE_ASSIGNEE=false

usage() {
    cat <<EOF
Usage: $(basename "$0") [OPTIONS]

Assign or update an issue on the current repository (Gitea or GitHub).

Options:
    -i, --issue NUMBER      Issue number (required)
    -a, --assignee USER     Assign to user (use @me for self)
    -l, --labels LABELS     Add comma-separated labels
    -m, --milestone NAME    Set milestone
    -r, --remove-assignee   Remove current assignee
    -h, --help              Show this help message

Examples:
    $(basename "$0") -i 42 -a "username"
    $(basename "$0") -i 42 -l "in-progress" -m "0.2.0"
    $(basename "$0") -i 42 -a @me
EOF
    exit 1
}

# Parse arguments
while [[ $# -gt 0 ]]; do
    case $1 in
        -i|--issue)
            ISSUE="$2"
            shift 2
            ;;
        -a|--assignee)
            ASSIGNEE="$2"
            shift 2
            ;;
        -l|--labels)
            LABELS="$2"
            shift 2
            ;;
        -m|--milestone)
            MILESTONE="$2"
            shift 2
            ;;
        -r|--remove-assignee)
            REMOVE_ASSIGNEE=true
            shift
            ;;
        -h|--help)
            usage
            ;;
        *)
            echo "Unknown option: $1" >&2
            usage
            ;;
    esac
done

if [[ -z "$ISSUE" ]]; then
    echo "Error: Issue number is required (-i)" >&2
    usage
fi

PLATFORM=$(detect_platform)

case "$PLATFORM" in
    github)
        if [[ -n "$ASSIGNEE" ]]; then
            gh issue edit "$ISSUE" --add-assignee "$ASSIGNEE"
        fi
        if [[ "$REMOVE_ASSIGNEE" == true ]]; then
            # Get current assignees and remove them
            CURRENT=$(gh issue view "$ISSUE" --json assignees -q '.assignees[].login' 2>/dev/null | tr '\n' ',')
            if [[ -n "$CURRENT" ]]; then
                gh issue edit "$ISSUE" --remove-assignee "${CURRENT%,}"
            fi
        fi
        if [[ -n "$LABELS" ]]; then
            gh issue edit "$ISSUE" --add-label "$LABELS"
        fi
        if [[ -n "$MILESTONE" ]]; then
            gh issue edit "$ISSUE" --milestone "$MILESTONE"
        fi
        echo "Issue #$ISSUE updated successfully"
        ;;
    gitea)
        # tea issue edit syntax
        CMD="tea issue edit $ISSUE"
        NEEDS_EDIT=false

        if [[ -n "$ASSIGNEE" ]]; then
            # tea uses --assignees flag
            CMD="$CMD --assignees \"$ASSIGNEE\""
            NEEDS_EDIT=true
        fi
        if [[ -n "$LABELS" ]]; then
            # tea uses --labels flag (replaces existing)
            CMD="$CMD --labels \"$LABELS\""
            NEEDS_EDIT=true
        fi
        if [[ -n "$MILESTONE" ]]; then
            MILESTONE_ID=$(tea milestones list 2>/dev/null | grep -E "^\s*[0-9]+" | grep "$MILESTONE" | awk '{print $1}' | head -1)
            if [[ -n "$MILESTONE_ID" ]]; then
                CMD="$CMD --milestone $MILESTONE_ID"
                NEEDS_EDIT=true
            else
                echo "Warning: Could not find milestone '$MILESTONE'" >&2
            fi
        fi

        if [[ "$NEEDS_EDIT" == true ]]; then
            eval "$CMD"
            echo "Issue #$ISSUE updated successfully"
        else
            echo "No changes specified"
        fi
        ;;
    *)
        echo "Error: Could not detect git platform" >&2
        exit 1
        ;;
esac
