#!/bin/bash

# Jira Sync Script
# This script fetches Jira issues, classifies them with AI, and uploads to BigQuery.

set -e  # Exit on any error

# Configuration
PROJECT_ID="${PROJECT_ID:-gcp-cp-bigquery-dev}"
DATASET="${DATASET:-jira}"
TABLE="${TABLE:-ticket}"
PROJECTS="${JIRA_PROJECTS:-TCOC,APID,FRM,ST,TCID}"
WINDOW_HOURS="${WINDOW_HOURS:-8}"
OUTPUT_DIR="data"

echo "Checking environment variables..."

if [ -z "$GOOGLE_APPLICATION_CREDENTIALS" ] && [ -z "$GOOGLE_GENERATIVE_AI_API_KEY" ]; then
    echo "ERROR: GOOGLE_APPLICATION_CREDENTIALS or GOOGLE_GENERATIVE_AI_API_KEY must be set"
    exit 1
fi

if [ -z "$JIRA_HOST" ] || [ -z "$JIRA_USER_EMAIL" ] || [ -z "$JIRA_API_TOKEN" ]; then
    echo "ERROR: JIRA_HOST, JIRA_USER_EMAIL, and JIRA_API_TOKEN must be set"
    exit 1
fi

echo "Environment variables are set"
echo "Setting up output directory: $OUTPUT_DIR"
mkdir -p "$OUTPUT_DIR"

eval "$(
    JIRA_PROJECTS="$PROJECTS" \
    TARGET_END_AT="${TARGET_END_AT:-}" \
    WINDOW_HOURS="$WINDOW_HOURS" \
    pnpm exec tsx ./scripts/resolve-sync-window.ts
)"

echo "Resolved Jira sync window: $DATE_RANGE"
echo "UTC anchors: $SYNC_WINDOW_START_UTC to $SYNC_WINDOW_END_UTC"

# Step 1: Fetch Jira issues
echo "Step 1: Fetching Jira issues for projects: $PROJECTS"

jira_cleaned_file="$OUTPUT_DIR/jira_cleaned_${FILE_TAG}.json"
jira_classified_file="$OUTPUT_DIR/jira_classified_${FILE_TAG}.json"
bigquery_data_file="$OUTPUT_DIR/bigquery_data_${FILE_TAG}.json"

pnpm exec tsx ./lib/cli.ts fetch \
    -p "$PROJECTS" \
    --from "$SYNC_WINDOW_START_JQL" \
    --to "$SYNC_WINDOW_END_JQL" \
    -o "$jira_cleaned_file"

issue_count=$(node -e "console.log(JSON.parse(require('fs').readFileSync('$jira_cleaned_file', 'utf8')).issues.length)")
echo "Fetched $issue_count issues"

if [ "$issue_count" -eq 0 ]; then
    echo "WARNING: No issues fetched, exiting early"
    if [ "$CI" = "true" ]; then
        echo "SYNC_WINDOW_START_UTC=${SYNC_WINDOW_START_UTC}" >> "$GITHUB_ENV"
        echo "SYNC_WINDOW_END_UTC=${SYNC_WINDOW_END_UTC}" >> "$GITHUB_ENV"
        echo "SYNC_WINDOW_START_LOCAL=${SYNC_WINDOW_START_LOCAL}" >> "$GITHUB_ENV"
        echo "SYNC_WINDOW_END_LOCAL=${SYNC_WINDOW_END_LOCAL}" >> "$GITHUB_ENV"
        echo "SYNC_WINDOW_HOURS=${SYNC_WINDOW_HOURS}" >> "$GITHUB_ENV"
        echo "SYNC_WINDOW_TIMEZONE=${SYNC_WINDOW_TIMEZONE}" >> "$GITHUB_ENV"
        echo "ISSUE_COUNT=0" >> "$GITHUB_ENV"
        echo "RECORD_COUNT=0" >> "$GITHUB_ENV"
        echo "PROJECTS=${PROJECTS}" >> "$GITHUB_ENV"
        echo "DATE_RANGE=${DATE_RANGE}" >> "$GITHUB_ENV"
        echo "BQ_UPLOAD_STATUS=skipped" >> "$GITHUB_ENV"
        echo "FILE_TAG=${FILE_TAG}" >> "$GITHUB_ENV"
        echo "SKIPPED_DUE_TO_NO_ISSUES=true" >> "$GITHUB_ENV"
    fi
    exit 0
fi

echo "Issues fetched and saved to $jira_cleaned_file"

# Step 2: AI Classification
echo "Step 2: Classifying issues with AI"

pnpm exec tsx ./lib/cli.ts classify direct \
    -i "$jira_cleaned_file:issues" \
    -p prompt/system_prompt_batch.md \
    -o "$jira_classified_file" \
    --model-id "gemini-3.7-flash" \
    --concurrency 8

echo "Issues classified and saved to $jira_classified_file"

# Step 3: Transform to BigQuery format
echo "Step 3: Transforming data to BigQuery format"

pnpm exec tsx ./lib/cli.ts merge \
    -i "$jira_classified_file" \
    -o "$bigquery_data_file"

record_count=$(node -e "console.log(JSON.parse(require('fs').readFileSync('$bigquery_data_file', 'utf8')).length)")
echo "Transformed $record_count records"
echo "Data transformed and saved to $bigquery_data_file"

# Step 4: Upload to BigQuery
echo "Step 4: Uploading to BigQuery ($PROJECT_ID.$DATASET.$TABLE)"

set +e
pnpm exec tsx ./lib/cli.ts upload \
    -i "$bigquery_data_file" \
    --project-id "$PROJECT_ID" \
    --dataset "$DATASET" \
    --table "$TABLE"
UPLOAD_EXIT_CODE=$?
set -e

if [ "$UPLOAD_EXIT_CODE" -ne 0 ]; then
    echo "WARNING: BigQuery upload failed (exit code $UPLOAD_EXIT_CODE)."
    echo "The transformed files are preserved under $OUTPUT_DIR/."
    BQ_UPLOAD_STATUS="failed"
    echo "failed" > "$OUTPUT_DIR/bq-upload-status-${FILE_TAG}.txt"
else
    echo "Data uploaded to BigQuery successfully"
    BQ_UPLOAD_STATUS="success"
    echo "success" > "$OUTPUT_DIR/bq-upload-status-${FILE_TAG}.txt"
fi

# Step 5: Upsert to Feishu Bitable (Lark)
echo "Step 5: Upserting to Feishu Bitable (Lark)"

if [ "${BQ_UPLOAD_STATUS}" = "success" ]; then
    if [ -n "$LARK_APP_ID" ] && [ -n "$LARK_APP_SECRET" ] && [ -n "$LARK_BITABLE_APP_TOKEN" ] && [ -n "$LARK_BITABLE_TABLE_ID" ] && [ -n "$LARK_BITABLE_VIEW_ID" ]; then
        pnpm exec tsx ./lib/cli.ts lark upsert -i "$bigquery_data_file" --project-id "$PROJECT_ID" --dataset "$DATASET" --table "$TABLE"
        LARK_EXIT_CODE=$?
        if [ "$LARK_EXIT_CODE" -eq 0 ]; then
            echo "Feishu Bitable upsert completed"
            LARK_UPDATE_STATUS="success"
        else
            echo "ERROR: Feishu Bitable upsert failed (exit code $LARK_EXIT_CODE)."
            LARK_UPDATE_STATUS="failed"
            exit $LARK_EXIT_CODE
        fi
    else
        echo "Skipping Lark upsert: missing Lark env variables (LARK_APP_ID/LARK_APP_SECRET/LARK_BITABLE_*)."
        LARK_UPDATE_STATUS="skipped_missing_env"
    fi
else
    echo "Skipping Lark upsert: BigQuery upload was not successful."
    LARK_UPDATE_STATUS="skipped_bq_failed"
fi

# Step 6: Output summary for CI
echo "Step 6: Outputting summary for CI"

issue_count=$(node -e "console.log(JSON.parse(require('fs').readFileSync('$jira_cleaned_file', 'utf8')).issues.length)" 2>/dev/null || echo "0")
record_count=$(node -e "console.log(JSON.parse(require('fs').readFileSync('$bigquery_data_file', 'utf8')).length)" 2>/dev/null || echo "0")

if [ "$CI" = "true" ]; then
    echo "SYNC_WINDOW_START_UTC=${SYNC_WINDOW_START_UTC}" >> "$GITHUB_ENV"
    echo "SYNC_WINDOW_END_UTC=${SYNC_WINDOW_END_UTC}" >> "$GITHUB_ENV"
    echo "SYNC_WINDOW_START_LOCAL=${SYNC_WINDOW_START_LOCAL}" >> "$GITHUB_ENV"
    echo "SYNC_WINDOW_END_LOCAL=${SYNC_WINDOW_END_LOCAL}" >> "$GITHUB_ENV"
    echo "SYNC_WINDOW_HOURS=${SYNC_WINDOW_HOURS}" >> "$GITHUB_ENV"
    echo "SYNC_WINDOW_TIMEZONE=${SYNC_WINDOW_TIMEZONE}" >> "$GITHUB_ENV"
    echo "ISSUE_COUNT=${issue_count}" >> "$GITHUB_ENV"
    echo "RECORD_COUNT=${record_count}" >> "$GITHUB_ENV"
    echo "PROJECTS=${PROJECTS}" >> "$GITHUB_ENV"
    echo "DATE_RANGE=${DATE_RANGE}" >> "$GITHUB_ENV"
    echo "BQ_UPLOAD_STATUS=${BQ_UPLOAD_STATUS:-unknown}" >> "$GITHUB_ENV"
    echo "LARK_UPDATE_STATUS=${LARK_UPDATE_STATUS:-skipped}" >> "$GITHUB_ENV"
    echo "FILE_TAG=${FILE_TAG}" >> "$GITHUB_ENV"
fi

echo "Jira sync completed successfully!"
echo "Files saved in: $OUTPUT_DIR/"
echo "- $(basename "$jira_cleaned_file")"
echo "- $(basename "$jira_classified_file")"
echo "- $(basename "$bigquery_data_file")"
